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?

1491voto

Dr. belisarius Punkte 59702

Nur eine Klarstellung

Obwohl die vorherigen Antworten richtig sind, wenn Sie versuchen, die Zufälligkeit einer Pseudo-Zufallsvariablen oder ihrer Multiplikation zu erkennen, sollten Sie sich bewusst sein, dass Sie zwar Random() ist in der Regel gleichmäßig verteilt, Zufällig() * Zufällig() ist nicht.

Beispiel

Dies ist eine Stichprobe mit einheitlicher Zufallsverteilung durch eine Pseudo-Zufallsvariable simuliert:

Histogram of Random()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

Dies ist die Verteilung, die man erhält, wenn man zwei Zufallsvariablen multipliziert:

Histogram of Random() * Random()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Beide sind also "zufällig", aber ihre Verteilung ist sehr unterschiedlich.

Ein weiteres Beispiel

Während 2 * Random() gleichmäßig verteilt ist:

Histogram of 2 * Random()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Random() + Random() ist nicht!

Histogram of Random() + Random()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Der zentrale Grenzwertsatz (Central Limit Theorem)

El Zentraler Grenzwertsatz besagt, dass die Summe der Random() tendiert zu einer Normalverteilung mit zunehmender Laufzeit.

Mit nur vier Begriffen erhalten Sie:

Histogram of Random() + Random() + Random() + Random()

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

Und hier sehen Sie den Weg von einer Gleichverteilung zu einer Normalverteilung, indem Sie 1, 2, 4, 6, 10 und 20 gleichverteilte Zufallsvariablen addieren:

Histogram of different numbers of random variables added

Modifier

Ein paar Credits

Dank an Thomas Ahle für den Hinweis in den Kommentaren, dass die in den letzten beiden Bildern gezeigten Wahrscheinlichkeitsverteilungen als Irwin-Hall-Vertrieb

Dank an Heike für ihre wunderbare zerrissen[] Funktion

152voto

Janco Punkte 1130

Ich schätze, dass beide Methoden gleich zufällig sind, obwohl mein Bauchgefühl sagt, dass rand() * rand() ist weniger zufällig, da mehr Nullen gesetzt würden. Sobald eine rand() es 0 wird die Summe 0

82voto

Matthew Scharley Punkte 121038

Weder das eine noch das andere ist "zufälliger".

rand() generiert eine vorhersagbare Menge von Zahlen auf der Grundlage eines Pseudo-Zufallswertes (normalerweise basierend auf der aktuellen Zeit, die sich ständig ändert). Die Multiplikation zweier aufeinanderfolgender Zahlen in der Sequenz erzeugt eine andere, aber ebenso vorhersehbare Zahlenfolge.

Auf die Frage, ob dies zu einer Verringerung der Kollisionen führen wird, lautet die Antwort nein. Vielmehr werden die Kollisionen durch die Multiplikation zweier Zahlen erhöht, wobei 0 < n < 1 . Das Ergebnis wird ein kleinerer Anteil sein, was zu einer Verzerrung des Ergebnisses in Richtung des unteren Endes des Spektrums führt.

Einige weitere Erklärungen. Im Folgenden beziehen sich die Begriffe "unvorhersehbar" und "zufällig" auf die Fähigkeit einer Person, die nächste Zahl auf der Grundlage der vorherigen Zahlen zu erraten, d. h. auf ein Orakel.

Gegebenes Saatgut x der die folgende Liste von Werten erzeugt:

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand() erzeugt die obige Liste, und rand() * rand() erzeugen:

0.18, 0.08, 0.08, 0.21, ...

Beide Methoden ergeben immer dieselbe Liste von Zahlen für denselben Seed und sind daher für ein Orakel gleichermaßen vorhersehbar. Aber wenn Sie sich die Ergebnisse für die Multiplikation der beiden Aufrufe ansehen, werden Sie feststellen, dass sie alle unter 0.3 trotz einer ordentlichen Verteilung in der ursprünglichen Folge. Die Zahlen sind aufgrund des Effekts der Multiplikation zweier Brüche verzerrt. Die sich ergebende Zahl ist immer kleiner und daher viel wahrscheinlicher, dass es sich um eine Kollision handelt, obwohl sie immer noch genauso unvorhersehbar ist.

80voto

Alin Purcaru Punkte 41895

Eine zu starke Vereinfachung, um einen Punkt zu illustrieren.

Angenommen, Ihre Zufallsfunktion gibt nur aus 0 o 1 .

random() ist eines der (0,1) aber random()*random() ist eines der (0,0,0,1)

Sie können deutlich sehen, dass die Chancen, eine 0 im zweiten Fall sind keineswegs gleichwertig mit denjenigen, die eine 1 .


Als ich diese Antwort zum ersten Mal veröffentlichte, wollte ich sie so kurz wie möglich halten, damit jemand, der sie liest, auf den ersten Blick den Unterschied zwischen random() y random()*random() aber ich kann es mir nicht verkneifen, auf die ursprüngliche Ad-litteram-Frage zu antworten:

Was ist mehr Zufall?

Da die random() , random()*random() , random()+random() , (random()+1)/2 oder jede andere Kombination, die nicht zu einem festen Ergebnis führt, dieselbe Entropiequelle (bzw. denselben Ausgangszustand im Falle von Pseudozufallsgeneratoren) haben, wäre die Antwort, dass sie ebenso zufällig (der Unterschied liegt in ihrer Verteilung). Ein perfektes Beispiel hierfür ist das Spiel Craps. Die Zahl, die Sie erhalten, wäre random(1,6)+random(1,6) und wir alle wissen, dass die 7 die höchste Wahrscheinlichkeit hat, aber das bedeutet nicht, dass das Ergebnis von zwei Würfeln mehr oder weniger zufällig ist als das Ergebnis von einem Würfel.

69voto

valadil Punkte 1548

Hier ist eine einfache Antwort. Nehmen wir Monopoly. Man würfelt mit zwei sechsseitigen Würfeln (oder 2d6 für diejenigen unter Ihnen, die die Spielnotation bevorzugen) und nimmt die Summe. Das häufigste Ergebnis ist 7, denn es gibt 6 Möglichkeiten, eine 7 zu würfeln (1,6 2,5 3,4 4,3 5,2 und 6,1). Eine 2 hingegen kann nur auf 1,1 gewürfelt werden. Es ist leicht zu erkennen, dass das Würfeln von 2d6 etwas anderes ist als das Würfeln von 1d12, auch wenn der Bereich derselbe ist (abgesehen davon, dass man bei 1d12 eine 1 erhalten kann, bleibt der Punkt derselbe). Wenn du deine Ergebnisse multiplizierst, anstatt sie zu addieren, werden sie in ähnlicher Weise verzerrt, wobei die meisten deiner Ergebnisse in der Mitte des Bereichs liegen. Wenn Sie versuchen, Ausreißer zu reduzieren, ist dies eine gute Methode, aber sie wird nicht dazu beitragen, eine gleichmäßige Verteilung zu erreichen.

(Und seltsamerweise wird es auch die niedrigen Rollen erhöhen. Angenommen, die Zufälligkeit beginnt bei 0, dann wirst du eine Spitze bei 0 sehen, weil sie alles, was der andere Wurf ist, in eine 0 verwandelt. Betrachte zwei Zufallszahlen zwischen 0 und 1 (einschließlich) und multipliziere sie. Wenn eines der Ergebnisse eine 0 ist, wird das Ganze zu einer 0, unabhängig vom anderen Ergebnis. Die einzige Möglichkeit, eine 1 zu erhalten, besteht darin, dass beide Würfe eine 1 ergeben. In der Praxis würde das wahrscheinlich keine Rolle spielen, aber es ergibt ein seltsames Diagramm).

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