Как использовать функцию srand() с time.h?

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

Я начал с функции rand, а затем использовал функцию srand() с заголовочным файлом time.h, но все же это не так. работает должным образом.

#define size 10
for(i=0;i<size;i++)
    Arr[i] = rand()%size;

Первый звонок (случайный):

6 0 2 0 6 7 5 5 8 6

Второй вызов (случайный, но такой же, как и предыдущий):

6 0 2 0 6 7 5 5 8 6

Позже я посетил вопросы о переполнении стека и прочитал о функции srand(), и я использовал ее как:

#include<time.h>
for(i=0;i<size;i++)
    Arr[i] = srand(time(NULL));

Первый звонок:

-10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327

Второй звонок:

-10326 -10326 -10326 -10326 -10326 -10326 -10326 -10326 -10326 -10326

Это дает мне разные (но не случайные значения). Я определил Arr[i] как unsigned int, но все равно получаю отрицательные значения.


person Community    schedule 15.05.2013    source источник
comment
вы поставили свое семя? Установите свое семя с функцией времени.   -  person Magn3s1um    schedule 15.05.2013
comment
Вам нужно вызвать srand только один раз, чтобы заполнить генератор rand. Не звоните srand каждый раз, чтобы узнать свои номера.   -  person TJD    schedule 15.05.2013
comment
Вероятно, вам следует прочитать справочную страницу, где объясняется, как работают эти функции, и предоставляется рабочий пример.   -  person Aya    schedule 15.05.2013
comment
@Magn3s1um Я не знаю, о чем ты говоришь   -  person    schedule 15.05.2013
comment
Вы устанавливаете свое семя с текущим временем: srand(time(null)). Тогда ты звонишь Рэнду. Таким образом, вы каждый раз получаете уникальное семя. Семя изменяет случайный алгоритм. Вы понимаете теперь?   -  person Magn3s1um    schedule 15.05.2013
comment
есть ли какая-либо конкретная причина для использования srand(), если нет, вы можете следовать [Как использовать /dev/random или urandom в C? stackoverflow ](stackoverflow.com/questions/2572366/)   -  person Potato    schedule 15.05.2013
comment
@Magn3s1um: ясное и краткое объяснение :)   -  person crisron    schedule 06.04.2016


Ответы (4)


Вам нужно вызвать srand() один раз, чтобы рандомизировать начальное число, а затем вызвать rand() в своем цикле:

#include <stdlib.h>
#include <time.h>

#define size 10

srand(time(NULL)); // randomize seed

for(i=0;i<size;i++)
    Arr[i] = rand()%size;
person Paul R    schedule 15.05.2013
comment
srand() принимает целое число без знака в качестве входных данных, поэтому время (NULL) должно быть преобразовано. - person Jiminion; 26.04.2017

Попробуйте вызвать randomize() перед rand(), чтобы инициализировать генератор случайных чисел.

(посмотрите: srand() - зачем вызывать его только один раз?)

person Ze..    schedule 15.05.2013
comment
Пожалуйста, напишите мне код, было бы очень полезно, если бы вы его вставили - person ; 15.05.2013
comment
randomize не является стандартной функцией - возможно, вы имеете в виду srand ? - person Paul R; 15.05.2013
comment
Пол Р., да, я имею в виду srand() из stdlib.h. Спасибо за добавление комментария. Моя ошибка. - person Ze..; 15.05.2013
comment
cplusplus.com/reference/cstdlib/srand содержит пример вызова srand. чем один раз. - person Ze..; 15.05.2013
comment
Этот пример иллюстрирует, что отсутствие вызова srand() имеет тот же эффект, что и вызов srand(1). Однако следует внести ясность. - person Daniel Fischer; 15.05.2013
comment
@eepak, может эта информация вам поможет: /questions/7343833/srand-why-call-only-once - person Ze..; 15.05.2013
comment
@ Даниэль Фишер, спасибо за подсказку. - person Ze..; 15.05.2013

Если вы выбрали srand, рекомендуется вызвать rand() по крайней мере один раз, прежде чем использовать его, потому что это своего рода ужасный примитивный генератор псевдослучайных чисел. См. вопрос о переполнении стека Почему rand() % 7 всегда возвращать 0?.

srand(time(NULL));
rand();
//Now use rand()

Если есть, лучше random или arc4rand.

person Grady Player    schedule 15.05.2013

person    schedule
comment
этот метод шифрования и дешифрования используется в подразделе программирования - person R.M.VIVEK Arni; 19.09.2014