Случайное Булево Значение
Я пытаюсь сгенерировать случайный int, который является либо 0, либо 1 в C++. Прямо сейчас, я получаю 0 каждый раз, когда я запускаю этот код, и я не уверен, почему. В чем тут проблема?
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;
7 ответов:
Я знаю, что это более старый вопрос, но я считаю, что это правильно отвечает на вопрос.
Не перезапускайте генератор каждый раз, когда вы запускаете этот код.
Каждый раз задавая одно и то же значение, вы просто получите одно и то же "случайное" число. Помните, что это генератор псевдослучайных чисел, поэтому на основе начального значения будет сгенерировано "случайное" число. Так что если вы будете сеять его с одним и тем же номером каждый раз, вы просто получите один и тот же номер каждый раз.
Решение заключается в вызове srand (time (NULL)) только один раз при выполнении программы. Затем каждый вызов rand () будет давать вам другой номер каждый раз.
По теории, есть 50% шанс, что вы получите
0, а 50 -1. Вы можете попробовать использовать другой модуль-например, 100, чтобы проверить, работает ли это. И я уверен, что это так.Вы просто выполнили этот код несколько раз, недостаточно.
Другая идея проверить это:
srand(time(0)); for( int i = 0; i < 1000000; ++i ) { assert( 0 == ( rand() % 2 ) ); }
Я хотел бы добавить, что при использовании
srand(time(0));"случайное число" всегда будет одинаковым в одну и ту же секунду. Когда я попытался запустить вашу программу 10000 раз и сгруппировать ее по uniq, я увидел, что число не изменится в течение секунды.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
Вы ни с чем не сверяетесь. Использование:
#include <ctime> #include <cstdlib> srand(time(0)); int randomval = rand() % 2 == 0; cout << randomval << endl;
Вызовите
srand(time(NULL));только один раз.Затем используйте цикл, подобный этому, вы всегда получите 0 или 1 таким образом.
#include <stdio.h> #include <stdlib.h> srand(time(NULL)); for (i=0;i<10;i++) { printf("%d\n",rand() % 2); i++; } return 0;
Comments