Случайное логическое значение - PullRequest
22 голосов
/ 08 декабря 2011

Я пытаюсь сгенерировать случайное значение типа int, равное 0 или 1 в C ++.Прямо сейчас я получаю 0 каждый раз, когда запускаю этот код, и я не знаю почему.В чем здесь проблема?

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;

Ответы [ 7 ]

147 голосов
/ 08 декабря 2011

Это называется невезением. Попробуйте еще раз.

21 голосов
/ 19 февраля 2014

Я знаю, что это старый вопрос, но я верю, что он правильно отвечает на вопрос.

Не перезапускайте генератор каждый раз, когда вы запускаете этот код.

Заполняя егок одному и тому же значению каждый раз, вы просто получите одно и то же «случайное» число.Помните, что это генератор псевдослучайных чисел, поэтому на основе начального значения будет сгенерировано «случайное» число.Поэтому, если вы каждый раз набираете один и тот же номер, вы всегда будете получать один и тот же номер.

Решение состоит в том, чтобы вызывать srand (time (NULL)) только один раз при выполнении вашей программы.Затем каждый вызов rand () будет каждый раз давать вам новый номер.

4 голосов
/ 08 декабря 2011

Теоретически, есть 50% шанс, что вы получите 0, а 50 - 1. Вы можете попробовать с другим модулем - например, 100, чтобы проверить, работает ли это. И я уверен, что это так.

Вы только что запустили этот код несколько раз, недостаточно.

Другая идея, чтобы проверить это:

srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
    assert( 0 == ( rand() % 2 ) );
}
1 голос
/ 26 апреля 2018
bool random() {
    if (rand() % 2 == 0)
        return true;
    else return false;
}
1 голос
/ 27 января 2015

Я хотел бы добавить, что при использовании 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
0 голосов
/ 03 мая 2017

Вы ничего не проверяете.Использование:

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = rand() % 2 == 0;
cout << randomval << endl;
0 голосов
/ 30 января 2015

Позвоните 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;
...