Waarom moeten we ' srand (time (NULL)) ' voor het genereren van willekeurige getallen in C ++?


Beste antwoord

Ik kan “geen beter antwoord geven dan Abhilash Gangadharan heeft gegeven. De” srand () “-functie van de standaard C-bibliotheek initialiseert verschillende waarden die het pseudo-willekeurige algoritme nodig heeft om semi-unieke uitvoer te genereren.

In sommige oudere generatoren werd de waarde direct gebruikt om het systeem een ​​vliegende start te geven, omdat ze dingen deden zoals modulo-prime wiskunde met wat feedback van het meest recent gegenereerde getal om entropie aan de berekening toe te voegen en het resultaat willekeurig te laten lijken. Modernere algoritmen (zoals de ietwat beroemde Mersenne Twister) hebben een soortgelijk feedbacksysteem, maar dit wordt anders gebruikt om voor een grotere hoeveelheid entropie te zorgen, waardoor de gegenereerde reeks getallen een groter aantal statistische tests voor willekeur doorstaat.

Het seeden van de PRNG met een bepaalde waarde zou altijd moeten resulteren in exact dezelfde output – dus als ik “srand (12345)” in een code noem en het “231,4492,2131” genereert op 14D EC2015, ik kan exact hetzelfde resultaat krijgen op 14DEC2016. (Dit wordt eigenlijk in sommige delen van cryptografie gebruikt om meer beveiliging aan sommige algoritmen toe te voegen, als ik me mijn onderzoek goed herinner)

Antwoord

Dit wordt “seed” de generator voor willekeurige getallen genoemd . Hierdoor kun je dezelfde reeks willekeurige getallen genereren als je een vast zaad gebruikt of als je een systeemparameter zoals tijd gebruikt, dan kun je elke keer met een ander zaadje beginnen en verschillende reeksen willekeurige getallen hebben. Dit helpt u te controleren of het resultaat van uw stochastische simulatie niet wordt beïnvloed door enige voorspelbaarheid in de willekeurige getallenreeks.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *