используя rand для генерации случайных чисел - PullRequest
8 голосов
/ 01 июля 2010

gcc 4.4.4 c89

Я использую код ниже.Тем не менее, я получаю одно и то же число:

    size_t i = 0;

    for(i = 0; i < 3; i++) {
        /* Initialize random number */
        srand((unsigned int)time(NULL));
        /* Added random number (simulate seconds) */
        add((rand() % 30) + 1);
    }

Я хотел бы получить от 0 до 30.Тем не менее, в последний раз, когда я запускал это, у меня было три раза 17

1007 * Большое спасибо

Ответы [ 6 ]

22 голосов
/ 01 июля 2010

Вы заполняете внутри цикла (с тем же значением из-за того, как быстро будет выполняться цикл), что приводит к тому, что генерируемое случайное число будет одинаковым каждый раз.

Вам нужно переместить свою начальную функцию за пределы цикл:

/* Initialize random number */
srand((unsigned int)time(NULL));

for(i = 0; i < 3; i++) {
    /* Added random number (simulate seconds) */
    add((rand() % 30) + 1);
}
9 голосов
/ 01 июля 2010

Вам нужно позвонить srand только один раз, в начале вашей программы.

srand инициализирует генератор псевдослучайных чисел, используя время в секундах. Если вы инициализируете его конкретным номером, вы всегда получите одну и ту же последовательность чисел. Вот почему вы обычно хотите инициализировать его в начале, используя время (чтобы начальное число отличалось при каждом запуске программы), а затем использовать только rand для генерации случайных чисел.

В вашем случае время не меняется от итерации к итерации, поскольку ее разрешение составляет всего 1 секунду, поэтому вы всегда получаете первое число псевдослучайной последовательности, которое всегда одинаково.

4 голосов
/ 01 июля 2010

Вам нужно сделать srand((unsigned int)time(NULL)) только один раз перед циклом.

2 голосов
/ 01 июля 2010

Вполне возможно, что 3 раза 17 все еще полностью случайны.

При использовании диапазона от 1 до 30 и трех пиков вероятность получения двух чисел одинакова примерно в 1 раз.(это связано с проблемой дня рождения )

Теперь, если получить три одинаковых результата, можно использовать 1 к 900 с использованием того же диапазона.чтобы прочитать дополнительную информацию на странице анализа random.org

1 голос
/ 02 июля 2010

Я скорее предлагаю также использовать системный вызов gettimeofday () для получения семени, которое будет использоваться для подачи srand ().

Что-то вроде


struct timeval tv;
...
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
...

Этот подход может добавить больше энтропии в ваш код генерации псевдо-числа. ИМХО конечно

Чао чао

1 голос
/ 02 июля 2010

Семя для генератора псевдослучайных чисел должно вызываться только один раз за пределами цикла.Использование времени как семени - это хорошо.Однако все еще есть возможность получить одно и то же случайное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...