Die meisten rand()-Implementierungen haben eine Periode. D.h. nach einer enormen Anzahl von Aufrufen wiederholt sich die Sequenz. Die Abfolge der Ausgaben von rand() * rand()
wiederholt sich in der Hälfte der Zeit, so dass es in diesem Sinne "weniger zufällig" ist.
Außerdem führt das Rechnen mit Zufallswerten ohne sorgfältige Konstruktion tendenziell zu weniger Zufälligkeit. Ein Poster oben zitierte " rand()
+ rand()
+ rand()
..." (z. B. k-mal), die in der Tat zum k-fachen Mittelwert des Wertebereichs tendieren wird rand()
zurück. (Es handelt sich um eine Zufallsbewegung mit symmetrischen Schritten um diesen Mittelwert.)
Nehmen wir an, dass Ihre Funktion rand() eine gleichmäßig verteilte reelle Zufallszahl im Bereich [0,1] zurückgibt. (Ja, in diesem Beispiel ist unendliche Genauigkeit möglich. Das ändert nichts am Ergebnis.) Sie haben keine bestimmte Sprache gewählt, und verschiedene Sprachen können unterschiedliche Dinge tun, aber die folgende Analyse gilt mit Änderungen für jede nicht-perverse Implementierung von rand(). Das Produkt rand() * rand()
liegt ebenfalls im Bereich [0,1), ist aber nicht mehr gleichmäßig verteilt. Tatsächlich liegt das Produkt mit gleicher Wahrscheinlichkeit im Intervall [0,1/4) wie im Intervall [1/4,1). Eine weitere Multiplikation wird das Ergebnis noch weiter gegen Null verschieben. Dadurch wird das Ergebnis vorhersehbarer. In groben Zügen bedeutet mehr Vorhersagbarkeit = weniger Zufall.
So gut wie jede Abfolge von Operationen bei gleichförmig zufälliger Eingabe wird ungleichförmig zufällig sein, was zu einer erhöhten Vorhersagbarkeit führt. Mit etwas Sorgfalt kann man diese Eigenschaft überwinden, aber dann wäre es einfacher gewesen, eine gleichmäßig verteilte Zufallszahl in dem Bereich zu erzeugen, den man eigentlich haben wollte, anstatt Zeit mit Arithmetik zu verschwenden.
5 Stimmen
Hier eine naive Definition für "Zufälliger": Für manche bedeutet "zufällig" "schwer zu erraten", z. B. den Wert der obersten Karte im Stapel zu erraten. Durch das Mischen des Stapels scheint es, dass der Zufallswert "noch schwerer zu erraten" ist, und von diesem praktischen, intuitiven Verständnis des Zufalls ausgehend, wäre es sinnvoll, den Stapel im Programm auf irgendeine Weise zu "mischen". Natürlich ist das nicht das, was "Zufall" bedeutet, und die Wissenschaft der Einführung von Entropie in einen pseudozufälligen Prozess ist nicht annähernd so einfach wie das Mischen des Prozesses mit seiner eigenen Ausgabe.
0 Stimmen
Danke @Yi Jiang und @Sam Saffron für die Korrekturen, ich bin eine Tippfehler-Maschine :)
0 Stimmen
@Mild Fuzz: Die Natur leugnet unendliche Unendlichkeiten? Sind das nicht Infinitesimale? Gibt es keine Fraktale in der Natur? Oder habe ich Ihre Aussage aufgrund meiner eigenen Dummheit völlig falsch verstanden?
0 Stimmen
@Trufa Zwei weitere Favs für dein Stellar Badge!
1 Stimmen
@belisarius Ich gebe es nur ungern zu, aber ich lade alle zehn Sekunden meinen Bildschirm neu und warte auf sie :)
0 Stimmen
@Herr Enttäuschung vielleicht bin ich ja dumm, aber die Natur der Unendlichkeit ist, dass sie grenzenlos ist, also würde die Quadratur des Kreises nichts bringen.
1 Stimmen
@Trufa Es ist erstaunlich, wie eine so einfache Frage so viel Interesse weckt!
1 Stimmen
@Liam Auf jeden Fall wusste ich, dass es keine einfache Antwort auf diese einfache Frage gibt, aber niemals diese. Ich denke, es ist ziemlich offensichtlich, dass ich die ganze Komplexität dieser Frage nicht gesehen hatte. Ich denke, dass die Antwort sehr gut über diese Gemeinschaft und ihren Wissenshunger aussagt! Ich bin froh, ein bescheidener Teil davon zu sein! :)
0 Stimmen
- (int) GetRandomNumber { return 4; /* TODO: Test this */ }