Dlaczego musimy zrobić ' srand (czas (NULL)) ' do generowania liczb losowych w C ++?


Najlepsza odpowiedź

Nie mogę udzielić lepszej odpowiedzi niż podał Abhilash Gangadharan. Funkcja „srand ()” w standardzie Biblioteka C inicjuje kilka wartości, których algorytm pseudolosowy potrzebuje do wygenerowania pół-unikatowych danych wyjściowych.

W niektórych starszych generatorach wartość była bezpośrednio używana do szybkiego uruchamiania systemu, ponieważ robili takie rzeczy jak modulo-prime matematyka z pewnymi informacjami zwrotnymi z ostatnio wygenerowanej liczby, aby dodać „entropię” do obliczeń i sprawić, że wynik będzie wyglądał na losowy. Bardziej nowoczesne algorytmy (takie jak nieco słynny „Mersenne Twister”) mają podobny system sprzężenia zwrotnego, ale jest on używany w inny sposób aby zapewnić większą liczbę entropii, co powoduje, że sekwencja wygenerowanych liczb przechodzi większą liczbę testów statystycznych na losowość.

Zasypanie PRNG daną wartością powinno zawsze dawać dokładnie ten sam wynik – stąd jeśli zadzwonię do „srand (12345)” w jakimś kodzie i wygeneruje „231,4492,2131” na 14D EC2015, mogę uzyskać dokładnie ten sam wynik w dniu 14DEC2016. (W rzeczywistości jest to używane w niektórych częściach kryptografii, aby zwiększyć bezpieczeństwo niektórych algorytmów, jeśli dobrze pamiętam swoje badania)

Odpowiedź

To się nazywa „ziarno” generatora liczb losowych . Pozwala to na wygenerowanie tej samej sekwencji liczb losowych, jeśli używasz stałego ziarna lub jeśli używasz jakiegoś parametru systemowego, takiego jak czas, możesz zacząć od innego ziarna za każdym razem i mieć różne sekwencje liczb losowych. Pomaga to sprawdzić, czy na wynik symulacji stochastycznej nie ma wpływu jakaś przewidywalność w ciągu liczb losowych.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *