78 votes

rand() entre 0 et 1

Donc le code suivant fait 0 < r < 1

r = ((double) rand() / (RAND_MAX))

Pourquoi le fait d'avoir r = ((double) rand() / (RAND_MAX + 1)) faire -1 < r < 0 ?

Le fait d'ajouter un à RAND_MAX ne devrait-il pas rendre 1 < r < 2 ?

Edit : Je recevais un avertissement : dépassement d'entier dans l'expression

sur cette ligne, donc ça pourrait être le problème. Je viens de faire cout << r << endl et cela me donne définitivement des valeurs entre -1 et 0

2 votes

Essayez d'ajouter 1 après le dernier )

15 votes

Notez que vous devez utiliser distribution_réelle_uniforme de toute façon pour ça. Si vous n'avez pas C++11, utilisez la fonction version améliorée .

0 votes

Erreur d'algèbre. Si r est un nombre aléatoire dans l'intervalle de zéro à m alors le rapport r/m sera dans l'intervalle (0,1) pero r/(m+1) sera dans l'intervalle (0, m/(m+1)) PAS la gamme (1,2) . Si m est très grand (par rapport à un), alors m/(m+1) est approximativement égal à un, donc votre expression r = ((double) rand() / (RAND_MAX + 1)) donnerait un nombre aléatoire approximativement dans l'intervalle (0,1) - c'est-à-dire, s'il n'y avait pas de débordement.

2voto

Pubby Points 29386

Je pense que RAND_MAX est égal à INT_MAX et donc vous le débordez en négatif.

Fais juste ça :

r = ((double) rand() / (RAND_MAX)) + 1;

Ou mieux encore, utilisez les générateurs de nombres aléatoires de C++11.

0 votes

Comme vous avez pris soin de faire une remarque sur la réponse de quelqu'un d'autre En effet, "déborder vers un négatif" est juste ce qui s'est passé dans le cas observé par le PO et n'est pas une description fiable, car le débordement est UB et donc le programme résultant peut faire n'importe quoi.

0voto

SeveneduS Points 21

Dans mon cas (j'utilise VS 2017), le code simple suivant fonctionne parfaitement :

#include "pch.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));

    for (int i = 1000; i > 0; i--) //try it thousand times
    {
        int randnum = (double)rand() / ((double)RAND_MAX + 1);
        std::cout << " rnum: " << rand()%2 ;
    }
}

0voto

Valtsuh Points 11

this->value = rand() % (this->max + 1);

Il semble que cela fonctionne bien entre 0 et 1++.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X