используя rand для генерации случайных чисел

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 три раза.

Большое спасибо,

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

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

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

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

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

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

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

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

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

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

вам может потребоваться больше информации на странице анализа random.org

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

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

Что-то вроде

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

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

пока пока

  • Эта программа звучит колокол!
  • Как получить знак, мантисса и показатель числа с плавающей запятой
  • Почему FILE * не сохраняет адрес открытого файла
  • srand (time (NULL)) не меняет начальное значение достаточно быстро
  • Как представить номер FLOAT в памяти на C
  • Как проверить, соответствует ли значение строке
  • Как массив хранится в памяти?
  • Почему возврат 0 необязателен?
  • проблема с плавающей запятой в R?
  • Целочисленное переполнение и неопределенное поведение
  • Как указатель на указатели работает в C?
  • Давайте будем гением компьютера.