2015-02-03 6 views
-7

Я не понимаю значение srand() в <time.h>, чтобы создать случайное число. Вот мой код:Значение srand()

/* srand example */ 
#include <stdio.h>  /* printf, NULL */ 
#include <stdlib.h>  /* srand, rand */ 
#include <time.h>  /* time */ 

int main() 
{ 
    printf ("First number: %d\n", rand()%100); 
    srand (time(NULL)); 
    printf ("Random number: %d\n", rand()%100); 
    srand (1); 
    printf ("Again the first number: %d\n", rand()%100); 

    return 0; 
} 

и результаты:

First number: 41 
Random number: 13 
Again the first number: 41 

Почему результат srand(1) отличного от srand(2)? Почему результаты srand(1) или srand(2) продолжают появляться снова и снова? И почему я должен использовать srand(time(NULL)), чтобы создать динамическое случайное число?

+0

читайте это: http://www.cplusplus.com/reference/cstdlib/srand/ –

+5

Почему это помечены c и C++? В C++ 'rand()' не должен использоваться вообще, он устарел и [считается вредным] (http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful). – leemes

+0

@leemes 'rand()' не является устаревшим и не считается вредным для C++. Он определенно имеет свои ограничения, но это верно с первых дней C. –

ответ

5

Если вы посмотрите на docs:

Семян генератора псевдослучайных чисел, используемый std::rand() с семенем значения.

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

srand(1); 
rand(); 

всегда будет одинаковым для данной реализации. Вот почему в примечаниях указывается, что:

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

0

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

Если вы не «семя» ваш генератор случайных чисел, он засевают 1

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

+0

Ваш второй абзац не применяется к стандартной библиотеке 'srand()/rand()'. Если вы не вызываете 'srand()' перед 'rand()', то это задокументировано, чтобы вести себя так, как если бы вызывался 'srand (1)'. – Blastfurnace

+0

@Blastfurnace да, вы правы, я отредактировал свой ответ. – Sridhar

1

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

0

Хм, вам нужно лучше понять, как Генераторы псевдослучайных чисел (PRNG) работают. Слово «Pseudo» очень важно: на самом деле очень сложно создать действительно случайное число, его проще взять (раз в секундах), а затем вычислить другие значения на его основе.

I.e.линейного конгруэнтного генератора, который часто используется для libcrand() вычисляет случайное число на основе предыдущего значения, так что:

formula from wiki

Первый Х устанавливается srand()

1

Функция rand() (и большинство других “ random ” источники) является реализация o f a “ генератор псевдослучайных чисел ”. Цифры, которые он генерирует, не являются случайными вообще, а просто номерами в очень длинной последовательности сдержанных значений; последовательность задается так, что последовательные числа кажутся случайными, в соответствии с некоторым подходящим определением случайных чисел.

Функция srand() просто устанавливает начальную точку в этой последовательности.

[1] Большинство ОС действительно имеют источник действительно случайных чисел, таких как файл /dev/random на Unix-системах. Однако они могут быть очень медленными для более чем нескольких байтов. В основном используется семена PRNG.