Proč musíme dělat ' srand (čas (NULL)) ' pro generování náhodných čísel v C ++?


Nejlepší odpověď

Nemohu dát lepší odpověď, než poskytla Abhilash Gangadharan. Funkce standardu „srand ()“ Knihovna C inicializuje několik hodnot, které pseudonáhodný algoritmus potřebuje k vygenerování semi-jedinečného výstupu.

V některých starších generátorech byla tato hodnota přímo použita k nastartování systému, protože to dělaly věci jako modulo-prime matematika s nějakou zpětnou vazbou od naposledy generovaného čísla, která přidá do výpočtu „entropii“ a výsledek bude náhodný. Modernější algoritmy (jako poněkud slavný „Mersenne Twister“) mají podobný systém zpětné vazby, ale ten se používá odlišně zajistit větší množství entropie, což způsobí, že sekvence generovaných čísel projde větším počtem statistických testů náhodnosti.

Naočkování PRNG s danou hodnotou by mělo vždy vést k přesně stejnému výstupu – tedy když zavolám „srand (12345)“ v nějakém kódu a vygeneruje „231,4492,2131“ na 14D EC2015, mohu získat přesně stejný výsledek 14DEC2016. (Toto se ve skutečnosti používá v některých částech kryptografie pro zvýšení bezpečnosti některých algoritmů, pokud si dobře pamatuji svůj výzkum.)

Odpověď

Tomu se říká „seed“ generátor náhodných čísel . To vám umožní vygenerovat stejnou posloupnost náhodných čísel, pokud používáte pevné semeno nebo pokud používáte nějaký systémový parametr, jako je čas, můžete pokaždé začít s jiným semínkem a mít různé sekvence náhodných čísel. To vám pomůže zkontrolovat, zda výsledek vaší stochastické simulace není ovlivněn určitou předvídatelností v pořadí náhodných čísel.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *