Зачем использовать время в srand?

Мне нравится учиться, возясь с кодом, недавно я скопировал и вставил код генератора случайных чисел. Затем я удалил все строки кода, которые не были необходимы для того, чтобы исполняемый файл работал для генерации случайного числа. Последней каплей стало удаление времени из srand.

srand ((беззнаковое) время (0));

Какой здесь момент времени (0)?

Используется ли время открытия программы для генерации начального числа для случайного числа? Поэтому, если удалить его (время), он не работает? Потому что тогда у него нет семени?

Также...

include <stdlib.h> 
include <stdio.h> 
include <time.h>

int main() 
{

srand((unsigned) time(0));

printf("Your dice has been rolled! You got:");

int result = 1 + (rand() % 20);

printf("%d", result);

}

это весь код, и я заметил, что он использовал результат rand для вывода. Извлекает ли ранд семя из ранда?


person sdparquinn    schedule 19.01.2021    source источник
comment
Вы должны суметь понять это самостоятельно: просто запустите вашу программу пару раз, с srand и без него, а затем посмотрите, сможете ли вы найти ответ самостоятельно. Это должно быть выполнимо. Когда вы увидите результаты, ответ должен быть очевиден.   -  person Sam Varshavchik    schedule 19.01.2021
comment
Семя, которое вы передаете в srand, не обязательно должно быть time (0) - это может быть любое значение, которое меняется каждый раз при вызове srand. Текущее время каждый раз разное, но вы также можете попросить пользователя ввести случайное число (при условии, что вы доверяете им как случайное) или можете подсчитать количество строк в файле журнала (при условии, что вы доверяете ему всегда меняется) или что-то еще. Самая простая вещь, которая не требует с вашей стороны какой-либо работы, - это текущее время, поэтому часто используется time (0).   -  person Jerry Jeremiah    schedule 19.01.2021
comment
человек 2 раза ???   -  person David C. Rankin    schedule 19.01.2021
comment
Просто здесь, чтобы указать, что rand () достаточно случайный для развлечения, но вам может понадобиться что-то получше для серьезной работы.   -  person John Bayko    schedule 19.01.2021


Ответы (2)


Если вы не «засеваете» генератор случайных чисел (или если вы используете то же начальное значение), вы получите тот же набор псевдослучайных чисел.

Использование текущего времени - простой способ каждый раз получать новое семя.

person Buddy    schedule 19.01.2021
comment
Не просто тот же набор чисел; та же последовательность. - person Pete Becker; 19.01.2021

Эффект srand не может пересекать потоки, поэтому начальное значение случайного числа должно быть установлено один раз для каждого потока. @Buddy сказал, что использование time (0) - самый удобный способ сделать это, и каждый вызов будет получать другое начальное число. Конечно, вы можете использовать атомарную переменную.

std::atomic<int> seek(2374213);  //init whatever you like
  
void thread1fun()
{
  srand(++seek);
  //...
  int rand_num = rand();
}

void thread2fun()
{
  srand(++seek);
  //...
  int rand_num = rand();
}
person Lichard    schedule 19.01.2021
comment
so the random number seed should be set once on each thread Есть ссылки? CppRef говорит Generally speaking, the pseudo-random number generator should only be seeded once, before any calls to rand(), and the start of the program. It should not be repeatedly seeded, or reseeded every time you wish to generate a new batch of pseudo-random numbers.. - person Sprite; 19.01.2021
comment
Я нашел ссылку здесь, но только для Windows. - person Sprite; 19.01.2021
comment
@Sprite - это не для Windows, это для компилятора Microsoft. - person Pete Becker; 19.01.2021