web-dev-qa-db-fra.com

Valeur booléenne aléatoire

J'essaie de générer un int aléatoire qui est soit 0 ou 1 en C++. En ce moment, je reçois un 0 chaque fois que j'exécute ce code, et je ne sais pas pourquoi. Quel est le problème ici?

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = Rand() % 2;
cout << randomval << endl;
24
Rich Byden

C'est ce qu'on appelle la malchance. Essayez à nouveau.

154

Je sais que c'est une question plus ancienne mais je crois que cela répond correctement à la question.

Ne redéfinissez pas le générateur à chaque fois que vous exécutez ce code.

En l'ensemencant à la même valeur à chaque fois, vous obtiendrez juste le même nombre "aléatoire". N'oubliez pas qu'il s'agit d'un générateur de nombres pseudo-aléatoires, donc en fonction de la valeur de départ, un nombre "aléatoire" sera généré. Donc, si vous le semez avec le même numéro à chaque fois, vous obtiendrez simplement le même numéro à chaque fois.

La solution consiste à appeler srand (time (NULL)) une seule fois dans l'exécution de votre programme. Ensuite, chaque appel à Rand () vous donnera à chaque fois un numéro différent.

24
cgossain

En théorie, il y a 50% de chances que vous obteniez 0 et 50 - 1. Vous voudrez peut-être essayer avec différents modules - par exemple 100, pour vérifier si cela fonctionne. Et je suis sûr que oui.

Vous venez d'exécuter ce code plusieurs fois, pas assez.

Autre idée pour le tester:

srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
    assert( 0 == ( Rand() % 2 ) );
}
4
Kiril Kirov
bool random() {
    if (Rand() % 2 == 0)
        return true;
    else return false;
}
2

Je voudrais ajouter que lorsque vous utilisez srand(time(0)); le "nombre aléatoire" sera toujours le même dans la même seconde. Lorsque j'ai essayé d'exécuter votre programme 10000 fois et de le regrouper par uniq, j'ai vu que le nombre ne changerait pas en une seconde.

for i in `seq 1 10000`; do ./a.out; done | uniq -c
    693 0
   3415 1
    675 0
    673 1
    665 0
    674 1
    668 0
    711 1
    694 0
    673 1
    459 0
1
toftis