используя 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 три раза.
- Квадрат числа определяется с помощью #define
- Загадка (в C)
- хранение денежных сумм в mysql
- Как получить длину функции в байтах?
- локальная переменная, инициализированная нулем в C
Большое спасибо,
- Поиск последовательной битовой строки 1 или 0
- n & (n-1), что делает это выражение?
- Печать изображений c # .net
- Практическое использование setjmp и longjmp в C
- Побитовая функция поворота влево
- что такое использование fflush (stdin) в программировании c
- Может ли printf быть заменен автоматически помещается в программу C?
- Разница между типами _Bool и bool в C?
Вы посеяны внутри цикла (с тем же значением из-за того, насколько быстро будет выполняться цикл), что приводит к тому, что случайное число сгенерировано одинаковым каждый раз.
Вам нужно переместить свою семенную функцию вне цикла:
/* 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); ...
Этот подход может добавить больше энтропии в ваш код генерации псевдокодов. ИМХО, конечно
пока пока