844 Stimmen

Das Verständnis des "Zufalls"

Ich kann mir das nicht erklären, was ist zufälliger?

rand()

OR :

rand() * rand()

Ich finde es eine echte Denksportaufgabe, könnten Sie mir helfen?


EDITAR:

Intuitiv weiß ich, dass die mathematische Antwort lauten wird, dass sie gleichermaßen zufällig sind, aber ich kann mir nicht helfen, aber ich denke, dass, wenn man den "Zufallszahlenalgorithmus" zweimal laufen lässt, wenn man die beiden miteinander multipliziert, etwas Zufälligeres entsteht als wenn man es nur einmal macht.

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?

51voto

crowne Punkte 8317

Die obligatorische xkcd ...
return 4; // chosen by fair dice roll, guaranteed to be random.

35voto

Juliet Punkte 78591

Es könnte hilfreich sein, sich dies in diskreteren Zahlen vorzustellen. Nehmen wir an, Sie möchten Zufallszahlen zwischen 1 und 36 generieren und beschließen, dass es am einfachsten ist, zwei faire, 6-seitige Würfel zu werfen. Sie erhalten dies:

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

Wir haben also 36 Nummern, aber nicht alle sind gleichmäßig vertreten, und einige kommen überhaupt nicht vor. Zahlen in der Nähe der Mitteldiagonale (linke untere Ecke bis rechte obere Ecke) kommen am häufigsten vor.

Die gleichen Prinzipien, die die ungerechte Verteilung zwischen Würfeln beschreiben, gelten auch für Gleitkommazahlen zwischen 0,0 und 1,0.

26voto

staticsan Punkte 29057

Einige Dinge über "Zufall" sind nicht intuitiv.

Unter der Annahme einer flachen Verteilung von rand() Mit den folgenden Optionen erhalten Sie nicht-flache Verteilungen:

  • hohe Vorspannung: sqrt(rand(range^2))
  • Vorurteile, die in der Mitte ihren Höhepunkt erreichen: (rand(range) + rand(range))/2
  • low:bias: range - sqrt(rand(range^2))

Es gibt noch viele andere Möglichkeiten zur Erstellung spezifischer Bias-Kurven. Ich habe einen kurzen Test gemacht mit rand() * rand() und man erhält eine sehr nicht-lineare Verteilung.

24voto

Eric Towers Punkte 4115

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.

23voto

abelenky Punkte 60187

"zufällig" vs. "eher zufällig" ist ein bisschen so, als würde man fragen, welche Null mehr Null ist.

In diesem Fall, rand ist ein PRNG, also nicht völlig zufällig. (in der Tat, ziemlich vorhersehbar, wenn der Seed bekannt ist). Die Multiplikation mit einem anderen Wert macht ihn nicht mehr oder weniger zufällig.

Ein echter Krypto-RNG wird tatsächlich zufällig sein. Und wenn man Werte durch irgendeine Funktion laufen lässt, kann man nicht mehr Entropie hinzufügen, sondern sehr wahrscheinlich Entropie entfernen, so dass sie nicht mehr zufällig sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X