it-swarm.com.de

"Zufälligkeit" verstehen

Ich kann mich nicht mit dem Kopf herumschlagen, was eher zufällig ist?

Rand()

OR

Rand() * Rand()

Ich finde es eine echte Denksportaufgabe. Könntest du mir helfen?

BEARBEITEN:

Ich weiß intuitiv, dass die mathematische Antwort sein wird, dass sie gleichermaßen zufällig sind, aber ich kann nicht anders als zu denken, dass wenn Sie den Zufallszahlenalgorithmus zweimal ausführen, wenn Sie die beiden Werte miteinander multiplizieren, Sie etwas mehr Zufälliges schaffen, als nur zu tun es einmal.

825
Trufa

Nur eine Klarstellung

Obwohl die vorherigen Antworten immer dann richtig sind, wenn Sie versuchen, die Zufälligkeit einer Pseudozufallsvariablen oder deren Multiplikation zu erkennen, sollten Sie beachten, dass while Random () ist in der Regel gleichmäßig verteilt, Random () * Random () nicht.

Beispiel

Dies ist eine Stichprobe mit gleichmäßiger Zufallsverteilung simuliert durch eine Pseudozufallsvariable:

Histogram of Random()

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

Dies ist die Verteilung, die Sie erhalten, wenn Sie zwei Zufallsvariablen multiplizieren:

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 anderes 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

Der zentrale Grenzwertsatz besagt, dass die Summe von Random () zu einem Normalverteilung mit zunehmenden Begriffen.

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 können Sie den Weg von einer Uniform zu einer Normalverteilung sehen, indem Sie 1, 2, 4, 6, 10 und 20 gleichmäßig verteilte Zufallsvariablen addieren:

Histogram of different numbers of random variables added

Bearbeiten

Ein paar Credits

Vielen Dank an Thomas Ahle für den Hinweis in den Kommentaren, dass die in den letzten beiden Bildern gezeigten Wahrscheinlichkeitsverteilungen als Irwin-Hall-Verteilung bekannt sind.

Danke an Heike für ihre wundervolle zerrissene [] Funktion

1477
Dr. belisarius

Ich denke, dass beide Methoden zufällig sind, obwohl mein Gefühl sagen würde, dass Rand() * Rand() weniger zufällig ist, weil es mehr Nullen aussähen würde. Sobald eine Rand()0 ist, wird die Summe 0

152
Janco

Weder ist "zufälliger".

Rand() generiert eine vorhersagbare Menge von Zahlen auf der Grundlage eines Pseudo-Zufalls-Startwerts (normalerweise basierend auf der aktuellen Uhrzeit, die sich ständig ändert). Das Multiplizieren von zwei aufeinanderfolgenden Zahlen in der Sequenz erzeugt eine andere, aber ebenso vorhersagbare Zahlenfolge.

Ansprechen, ob dadurch Kollisionen reduziert werden, lautet die Antwort Nein. Es wird tatsächlich Kollisionen aufgrund des Effekts der Multiplikation zweier Zahlen mit 0 < n < 1 erhöhen. Das Ergebnis ist ein kleinerer Bruch, wodurch das Ergebnis zum unteren Ende des Spektrums verschoben wird.

Einige weitere Erklärungen. In der folgenden Beschreibung beziehen sich "unvorhersehbar" und "zufällig" auf die Fähigkeit einer Person, zu erraten, welche nächste Zahl auf vorherigen Zahlen basiert, d. H. ein Oracle.

Gegebenes Startwert x, das die folgende Liste von Werten generiert: 

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

Rand() generiert die obige Liste und Rand() * Rand() generiert Folgendes:

0.18, 0.08, 0.08, 0.21, ...

Beide Methoden erzeugen immer die gleiche Liste von Zahlen für denselben Samen und sind daher von einem Oracle gleichermaßen vorhersagbar. Wenn Sie sich jedoch die Ergebnisse für das Multiplizieren der beiden Aufrufe ansehen, werden Sie feststellen, dass sie alle unter 0.3 stehen, trotz einer anständigen Verteilung in der ursprünglichen Reihenfolge. Die Zahlen sind aufgrund des Effekts der Multiplikation zweier Brüche parteiisch. Die resultierende Anzahl ist immer geringer, daher ist es wahrscheinlich viel eher eine Kollision, obwohl sie noch genauso unvorhersehbar ist.

81

Vereinfachung zur Veranschaulichung eines Punktes.  

Angenommen, Ihre Zufallsfunktion gibt nur 0 oder 1 aus. 

random() ist eine von (0,1), aber random()*random() ist eine von (0,0,0,1) 

Sie können deutlich erkennen, dass die Chancen, einen 0 zu erhalten, im zweiten Fall keinesfalls denjenigen entsprechen, die einen 1 erhalten.


Als ich diese Antwort zum ersten Mal gepostet hatte, wollte ich sie so kurz wie möglich halten, damit eine Person, die sie liest, den Unterschied zwischen random() und random()*random() auf einen Blick versteht, aber ich kann mich nicht der Beantwortung der ursprünglichen Litteram-Frage stellen:

Was ist zufällig?

Da dies random(), random()*random(), random()+random(), (random()+1)/2 oder jede andere Kombination, die nicht zu einem festen Ergebnis führt, dieselbe Entropiequelle (oder den gleichen Anfangszustand bei Pseudozufallsgeneratoren) hat, wäre die Antwort, dass sie gleichermaßen zufällig (Der Unterschied liegt in ihrer Verteilung). Ein perfektes Beispiel, das wir uns ansehen können, ist das Craps-Spiel. Die Zahl, die Sie erhalten, wäre random(1,6)+random(1,6), und wir wissen alle, dass das Erhalten von 7 die höchste Chance hat, aber das bedeutet nicht, dass das Ergebnis des Würfelns von zwei Würfeln mehr oder weniger zufällig ist als das Ergebnis des Würfelns von einem.

79
Alin Purcaru

Hier ist eine einfache Antwort. Betrachten Sie das Monopol. Sie würfeln zwei sechsseitige Würfel (oder 2W6 für diejenigen, die die Spielnotation bevorzugen) und nehmen ihre Summe. Das häufigste Ergebnis ist 7, da es 6 Möglichkeiten gibt, eine 7 zu würfeln (1,6 2,5 3,4 4,3 5,2 und 6,1). Während eine 2 nur auf 1,1 gerollt werden kann. Es ist leicht zu erkennen, dass das Rollen von 2W6 sich vom Würfeln von 1W12 unterscheidet, selbst wenn der Bereich derselbe ist (ignoriert man, dass man eine 1 auf einem 1W12 bekommen kann, bleibt der Punkt derselbe). Wenn Sie Ihre Ergebnisse multiplizieren, anstatt sie hinzuzufügen, werden sie auf ähnliche Weise verzerrt. Die meisten Ihrer Ergebnisse werden in der Mitte des Bereichs angezeigt. Wenn Sie versuchen, Ausreißer zu reduzieren, ist dies eine gute Methode, aber es hilft nicht, eine gleichmäßige Verteilung zu erreichen.

(Und seltsamerweise werden auch die niedrigen Würfel erhöht. Angenommen, Ihre Zufälligkeit beginnt bei 0, und Sie sehen eine Spitze bei 0, da dies den jeweils anderen Wurf in eine 0 umwandeln wird.) Betrachten Sie zwei Zufallszahlen zwischen 0 und 1 (einschließlich) ) und Multiplikation: Wenn eines der Ergebnisse eine 0 ist, wird das Ganze eine 0, unabhängig vom anderen Ergebnis. Die einzige Möglichkeit, eine 1 zu erzielen, besteht darin, dass beide Würfe eine 1 sind. In der Praxis wäre dies wahrscheinlich unwichtig aber es macht ein komisches Diagramm.)

67
valadil

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

53
crowne

Es kann hilfreich sein, dies in diskreterer Anzahl zu denken. Stellen Sie sich vor, Sie möchten Zufallszahlen zwischen 1 und 36 generieren, so dass Sie am einfachsten zwei faire, 6-seitige Würfel werfen. Du bekommst das:

     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 Zahlen, aber nicht alle sind gut vertreten und manche kommen überhaupt nicht vor. Zahlen in der Nähe der Mitteldiagonale (linke untere Ecke bis obere rechte Ecke) werden mit der höchsten Frequenz angezeigt.

Die gleichen Prinzipien, die die unfaire Verteilung zwischen Würfeln beschreiben, gelten gleichermaßen für Fließkommazahlen zwischen 0,0 und 1,0.

35
Juliet

Einige Dinge über "Zufälligkeit" sind nicht intuitiv. 

Unter der Annahme einer flachen Verteilung von Rand() erhalten Sie folgende Verteilungen für nicht flache Verteilung:

  • hohe Vorspannung: sqrt(Rand(range^2))
  • bias Peaking in der Mitte: (Rand(range) + Rand(range))/2
  • niedrig: Verzerrung: range - sqrt(Rand(range^2))

Es gibt viele andere Möglichkeiten, um bestimmte Bias-Kurven zu erstellen. Ich habe einen kurzen Test von Rand() * Rand() durchgeführt, und Sie erhalten eine sehr nichtlineare Verteilung.

26
staticsan

"random" vs. "more random" ist ein bisschen wie die Frage, welcher Zero mehr Null ist.

In diesem Fall ist Rand ein PRNG, also nicht völlig zufällig. (in der Tat ziemlich vorhersehbar, wenn der Samen bekannt ist). Multipliziert man es mit einem anderen Wert, wird es nicht mehr oder weniger zufällig.

Eine echte Krypto-RNG ist tatsächlich zufällig. Das Durchführen von Werten durch eine beliebige Funktion kann nicht mehr Entropie hinzufügen und kann sehr wahrscheinlich die Entropie entfernen, sodass sie nicht mehr zufällig ist.

23
abelenky

Die meisten Rand () - Implementierungen haben einen gewissen Zeitraum. D.h. Nach einer enormen Anzahl von Anrufen wiederholt sich die Sequenz. Die Folge der Ausgaben von Rand() * Rand() wiederholt sich in der Hälfte der Zeit und ist in diesem Sinne "weniger zufällig".

Ohne sorgfältige Konstruktion führt die Arithmetik von Zufallswerten dazu, dass die Zufälligkeit geringer ist. Ein oben zitiertes Plakat "Rand() + Rand() + Rand() ..." (etwa k-mal), das tatsächlich dazu neigt, den Mittelwert des Wertebereichs Rand() zu k-fach zu neigen. (Es ist ein zufälliger Spaziergang mit symmetrischen Schritten zu diesem Mittelwert.)

Nehmen Sie zur Konkretheit an, dass Ihre Rand () - Funktion eine gleichmäßig verteilte reelle Zufallszahl im Bereich von [0,1] zurückgibt. (Ja, dieses Beispiel erlaubt unendliche Präzision. Dies ändert nichts an dem Ergebnis.) Sie haben keine bestimmte Sprache ausgewählt, und verschiedene Sprachen können andere Dinge tun, aber die folgende Analyse gilt für Modifikationen für jede nicht-perverse Implementierung von Rand ( ). Das Produkt Rand() * Rand() liegt ebenfalls im Bereich [0,1), ist jedoch nicht mehr gleichmäßig verteilt. Tatsächlich liegt das Produkt wahrscheinlich im Intervall [0,1/4) wie im Intervall [1/4,1). Mehr Multiplikationen führen dazu, dass das Ergebnis noch weiter gegen Null geht. Dies macht das Ergebnis vorhersehbarer. In großen Schlägen vorhersagbarer == weniger zufällig.

So gut wie jede Folge von Operationen mit gleichmäßiger Zufallseingabe ist ungleichmäßig zufällig, was zu einer erhöhten Vorhersagbarkeit führt. Mit Vorsicht kann man diese Eigenschaft überwinden, aber dann wäre es einfacher gewesen, eine gleichmäßig verteilte Zufallszahl in dem Bereich zu erzeugen, den Sie eigentlich wollten, als Zeit mit der Arithmetik zu verschwenden.

23
Eric Towers

Das Konzept, das Sie suchen, ist "Entropie", der "Grad" der Unordnung einer Zeichenfolge Von Bits. Die Idee ist in Bezug auf das Konzept der "maximalen Entropie" am leichtesten zu verstehen.

Eine ungefähre Definition einer Bitkette mit maximaler Entropie besteht darin, dass sie nicht in Form einer kürzeren Bitkette genau ausgedrückt werden kann (z. B. mit einem Algorithmus, um Die kleinere auf die ursprüngliche Kette zu erweitern).

Die Relevanz der maximalen Entropie für die Zufälligkeit ergibt sich aus der Tatsache, dass Wenn Sie eine Zahl "zufällig" auswählen, werden Sie fast sicher eine Zahl Auswählen, deren Bit-String der maximalen Entropie nahe kommt, das heißt, sie kann nicht komprimiert werden .. Dies ist unser bestes Verständnis dessen, was eine "zufällige" Zahl kennzeichnet.

Wenn Sie also aus zwei zufälligen Stichproben eine Zufallszahl machen wollen, die "zweimal" als Random ist, würden Sie verketten die beiden Bitketten zusammensetzen. Praktisch würdest du die Samples einfach in die oberen und unteren Hälften eines doppelt langen Wortes füllen.

Ein praktischer Hinweis: Wenn Sie sich mit einem beschissenen Rand () aufgesattelt fühlen, kann es manchmal helfen, ein paar Samples zusammen zu drucken, obwohl, selbst wenn es wirklich gebrochen ist, diese Prozedur nicht funktioniert Hilfe.

19

Die akzeptierte Antwort ist sehr schön, aber es gibt noch einen anderen Weg, um Ihre Frage zu beantworten. PachydermPunchers Antwort nimmt diesen alternativen Ansatz bereits an, und ich werde ihn nur ein wenig erweitern.

Der einfachste Weg, über Informationstheorie nachzudenken, ist die kleinste Informationseinheit, ein einzelnes Bit.

In der C-Standardbibliothek gibt Rand() eine Ganzzahl im Bereich von 0 bis Rand_MAX zurück. Diese Grenze kann je nach Plattform unterschiedlich definiert werden. Angenommen, Rand_MAX wird definiert als 2^n - 1, wobei n eine ganze Zahl ist (dies ist in der Microsoft-Implementierung der Fall, wobei n 15 ist). Dann würden wir sagen, dass eine gute Implementierung n Informationsbits liefert.

Stellen Sie sich vor, dass Rand() Zufallszahlen erstellt, indem Sie eine Münze umdrehen, um den Wert von einem Bit zu ermitteln, und dann wiederholen, bis ein Stapel von 15 Bits vorhanden ist. Dann sind die Bits unabhängig (der Wert eines beliebigen Bits beeinflusst nicht die Wahrscheinlichkeit, dass andere Bits in derselben Charge einen bestimmten Wert haben). Jedes Bit, das unabhängig betrachtet wird, ist also wie eine Zufallszahl zwischen 0 und 1 und wird über diesen Bereich "gleichmäßig verteilt" (wahrscheinlich gleich 0 wie 1).

Durch die Unabhängigkeit der Bits wird sichergestellt, dass die durch Stapel von Bits dargestellten Zahlen ebenfalls gleichmäßig über ihren Bereich verteilt werden. Dies ist intuitiv offensichtlich: Wenn es 15 Bits gibt, ist der zulässige Bereich null bis 2^15 - 1 = 32767. Jede Zahl in diesem Bereich ist ein eindeutiges Muster von Bits, z.

010110101110010

und wenn die Bits unabhängig sind, tritt wahrscheinlicher kein Muster auf als irgendein anderes Muster. Daher sind alle möglichen Zahlen im Bereich gleich wahrscheinlich. Und umgekehrt gilt: Wenn Rand() gleichmäßig verteilte Ganzzahlen erzeugt, dann bestehen diese Zahlen aus unabhängigen Bits.

Stellen Sie sich Rand() als eine Produktionslinie für die Herstellung von Bits vor, die zufällig in Chargen beliebiger Größe eingesetzt wird. Wenn Sie die Größe nicht mögen, teilen Sie die Stapel in einzelne Bits auf und setzen Sie sie dann in beliebiger Menge wieder zusammen. Wenn Sie jedoch einen bestimmten Bereich benötigen, der keine Potenz von 2 ist, müssen Sie Ihre Zahlen verkleinern Die einfachste Möglichkeit, dies zu tun, ist die Umwandlung in Fließkommazahlen.

Wenn Sie zu Ihrem ursprünglichen Vorschlag zurückkehren, nehmen Sie an, Sie möchten von Chargen von 15 zu Chargen von 30 wechseln, fragen Sie Rand() nach der ersten Zahl, verschieben Sie sie um 15 Stellen und fügen Sie dann eine weitere Rand() hinzu. Dies ist eine Möglichkeit, zwei Aufrufe von Rand() zu kombinieren, ohne eine gleichmäßige Verteilung zu stören. Es funktioniert einfach, weil es keine Überlappung zwischen den Orten gibt, an denen Sie die Informationsbits platzieren.

Dies unterscheidet sich sehr vom "Strecken" des Bereichs von Rand() durch Multiplikation mit einer Konstanten. Wenn Sie zum Beispiel den Bereich von Rand() verdoppeln möchten, können Sie dies mit zwei multiplizieren - aber jetzt erhalten Sie immer nur gerade Zahlen und niemals ungerade Zahlen! Dies ist nicht gerade eine reibungslose Verteilung und kann abhängig von der Anwendung ein ernstes Problem sein, z. ein Roulette-ähnliches Spiel, das angeblich ungerade/gerade Wetten erlaubt. (Indem Sie in Form von Bits denken, vermeiden Sie diesen Fehler intuitiv, da Sie feststellen, dass das Multiplizieren mit zwei das Gleiche ist, wenn Sie die Bits nach links (größere Bedeutung) um eine Stelle verschieben und die Lücke mit Null füllen. Die Menge an Informationen ist also offensichtlich gleich - sie hat sich nur ein wenig bewegt.)

Solche Lücken in Zahlenbereichen können in Fließkommazahlanwendungen nicht berücksichtigt werden, da Fließkommazahlen von Natur aus Lücken aufweisen, die einfach nicht dargestellt werden können: In der Lücke zwischen gibt es eine unendlich Zahl jeweils zwei darstellbare Fließkommazahlen! Wir müssen also nur lernen, mit Lücken zu leben.

Wie andere gewarnt haben, ist Intuition in diesem Bereich riskant, vor allem, weil Mathematiker der Verlockung von reellen Zahlen nicht widerstehen können, die schrecklich verwirrende Dinge voller knorriger Unendlichkeiten und scheinbarer Paradoxien sind.

Aber zumindest, wenn Sie es für Bits halten, könnte Ihre Intuition Sie ein wenig weiterbringen. Bits sind wirklich einfach - selbst Computer können sie verstehen.

13

Wie andere schon gesagt haben, lautet die einfache kurze Antwort: Nein, es ist nicht mehr zufällig, aber es verändert die Verteilung.

Angenommen, Sie spielten ein Würfelspiel. Sie haben völlig faire, zufällige Würfel. Wären die Würfel "zufälliger", wenn Sie vor jedem Würfelwurf zuerst zwei Würfel in eine Schüssel geben, schütteln, einen der Würfel zufällig auswählen und dann würfeln? Natürlich würde es keinen Unterschied machen. Wenn beide Würfel Zufallszahlen ergeben, macht das zufällige Auswählen eines der beiden Würfel keinen Unterschied. So oder so erhalten Sie eine Zufallszahl zwischen 1 und 6 mit gleichmäßiger Verteilung auf eine ausreichende Anzahl von Rollen.

Ich nehme an, ein solches Verfahren kann im wirklichen Leben nützlich sein, wenn Sie den Verdacht hegen, dass die Würfel NICHT fair sind. Wenn beispielsweise die Würfel etwas unausgewogen sind, so neigt einer dazu, 1 häufiger als 1/6 der Zeit zu geben, und ein anderer tendiert dazu, ungewöhnlich oft 6 zu ergeben, dann würde eine zufällige Wahl zwischen den beiden dazu führen, dass die Tendenz verschleiert wird. (In diesem Fall würden 1 und 6 jedoch noch mehr als 2, 3, 4 und 5 sein. Nun, ich denke, abhängig von der Art des Ungleichgewichts.)

Es gibt viele Definitionen von Zufälligkeit. Eine Definition einer Zufallsreihe ist, dass es sich um eine Reihe von Zahlen handelt, die durch einen Zufallsprozess erzeugt werden. Nach dieser Definition ist es eine zufällige Serie, wenn ich fünf Mal einen fairen Würfel wirke und die Zahlen 2, 4, 3, 2, 5 bekomme. Wenn ich dann den gleichen fairen Würfel noch 5 mal rolle und 1, 1, 1, 1, 1 bekomme, dann ist das auch eine zufällige Serie.

Mehrere Poster haben darauf hingewiesen, dass zufällige Funktionen auf einem Computer nicht wirklich zufällig, sondern eher pseudo-zufällig sind und dass, wenn Sie den Algorithmus und den Samen kennen, sie vollständig vorhersagbar sind. Dies ist wahr, aber meistens völlig irrelevant. Wenn ich ein Kartenspiel mische und sie dann einzeln umlege, sollte dies eine zufällige Serie sein. Wenn jemand auf die Karten schaut, ist das Ergebnis völlig vorhersehbar, aber bei den meisten Definitionen von Zufälligkeit wird dies nicht weniger zufällig. Wenn die Serie statistische Tests der Zufälligkeit bestanden hat, ändert dies nichts an der Tatsache, dass ich auf die Karten geschaut habe. Wenn wir in der Praxis hohe Summen einsetzen, um die nächste Karte zu erraten, ist die Tatsache, dass Sie die Karten angesehen haben, äußerst relevant. Wenn wir die Serie verwenden, um die Menüauswahl der Besucher unserer Website zu simulieren, um die Leistung des Systems zu testen, macht die Tatsache, dass Sie einen Blick darauf werfen, keinen Unterschied. (Solange Sie das Programm nicht ändern, um dieses Wissen zu nutzen.)

EDIT

Ich glaube nicht, dass ich meine Antwort auf das Monty Hall-Problem in einem Kommentar zusammenfassen könnte, daher werde ich meine Antwort aktualisieren.

Für diejenigen, die den Belisarius-Link nicht gelesen haben, lautet der Gist: Ein Game-Show-Kandidat hat die Wahl zwischen 3 Türen. Hinter einem steckt ein wertvoller Preis, hinter den anderen etwas wertlos. Er wählt Tür Nr. 1 aus. Bevor bekannt wird, ob es ein Gewinner oder ein Verlierer ist, öffnet der Gastgeber die Tür Nr. 3 und zeigt an, dass es ein Verlierer ist. Dann gibt er dem Teilnehmer die Möglichkeit, zu Tür Nr. 2 zu wechseln. Sollte der Teilnehmer dies tun oder nicht?

Die Antwort, die die Intuition vieler Menschen beleidigt, ist, dass er wechseln sollte. Die Wahrscheinlichkeit, dass seine ursprüngliche Auswahl der Gewinner war, ist 1/3, die andere Tür ist der Gewinner ist 2/3. Meine anfängliche Intuition, zusammen mit der vieler anderer Leute, ist, dass es keinen Vorteil beim Wechseln geben würde, dass die Chancen gerade auf 50:50 geändert wurden.

Angenommen, jemand schaltete den Fernseher ein, kurz nachdem der Gastgeber die untergegangene Tür geöffnet hatte. Diese Person würde zwei geschlossene Türen sehen. Vorausgesetzt, er kennt die Natur des Spiels, würde er sagen, dass es eine halbe Chance gibt, dass jede Tür den Preis versteckt. Wie können die Chancen für den Zuschauer 1/2: 1/2 sein, während die Chancen für den Teilnehmer 1/3: 2/3 sind?

Ich musste wirklich darüber nachdenken, um meine Intuition in Form zu bringen. Um es in den Griff zu bekommen, müssen Sie verstehen, dass wir unter Wahrscheinlichkeiten in einem solchen Problem die Wahrscheinlichkeit verstehen, die Sie angesichts der verfügbaren Informationen zuweisen. Für ein Mitglied der Crew, das den Preis hinter Tür 1 gesetzt hat, ist die Wahrscheinlichkeit, dass sich der Preis hinter Tür 1 befindet, 100% und die Wahrscheinlichkeit, dass er hinter einer der beiden anderen Türen liegt, gleich Null.

Die Quoten der Besatzungsmitglieder unterscheiden sich von den Wettbewerberquoten, da er etwas weiß, das der Teilnehmer nicht kennt, nämlich welche Tür er hinter den Preis setzt. Ebenso unterscheidet sich die Quote des Teilnehmers von der Quote des Zuschauers, da er etwas weiß, das der Zuschauer nicht kennt, nämlich welche Tür er zuerst gewählt hat. Dies ist nicht unerheblich, da die Wahl der Gastgeber, welche Tür geöffnet werden soll, nicht zufällig ist. Er öffnet nicht die Tür, die der Teilnehmer ausgewählt hat, und er öffnet nicht die Tür, die den Preis verbirgt. Wenn es sich um dieselbe Tür handelt, bleiben ihm zwei Möglichkeiten. Wenn es sich um unterschiedliche Türen handelt, bleibt nur eine davon übrig.Wie kommen wir zu 1/3 und 2/3? Als der Kandidat ursprünglich eine Tür auswählte, hatte er eine 1/3 Chance, den Gewinner auszuwählen. Ich denke, das ist offensichtlich. Das bedeutet, dass eine 2/3 Chance bestand, dass eine der anderen Türen der Gewinner ist. Wenn der Host-Spiel ihm die Möglichkeit gibt, ohne zusätzliche Informationen zu wechseln, gibt es keinen Gewinn. Auch dies sollte offensichtlich sein. Aber eine Möglichkeit, es zu betrachten, ist zu sagen, dass es eine 2/3 Chance gibt, dass er durch einen Wechsel gewinnen würde. Aber er hat 2 Alternativen. Jeder hat also nur 2/3 geteilt durch 2 = 1/3 Chance, der Gewinner zu sein, was nicht besser ist als sein ursprünglicher Tipp. Natürlich haben wir das Endergebnis bereits gekannt, es wird nur anders berechnet.

Nun zeigt der Gastgeber, dass eine dieser beiden Möglichkeiten nicht der Gewinner ist. Von der 2/3 Chance, dass eine Tür, die er nicht ausgesucht hat, der Gewinner ist, weiß er jetzt, dass eine der zwei Alternativen nicht wahr ist. Der andere könnte oder nicht sein. Er hat also nicht mehr 2/3 durch 2 geteilt. Er hat Null für die offene Tür und 2/3 für die geschlossene Tür.

But now the Host reveals that one of those two choices is not the winner. So of the 2/3 chance that a door he didn't pick is the winner, he now knows that 1 of the 2 alternatives isn't it. The other might or might not be. So he no longer has 2/3 dividied by 2. He has zero for the open door and 2/3 for the closed door.

12
Jay

Stellen Sie sich vor, Sie haben ein einfaches Münzwurfproblem, bei dem gerade Köpfe und ungerade Schwänze gelten. Die logische Implementierung ist:

Rand() mod 2

Bei einer ausreichend großen Verteilung sollte die Anzahl der geraden Zahlen der Anzahl der ungeraden Zahlen entsprechen.

Betrachten wir nun einen kleinen Tweak:

Rand() * Rand() mod 2

Wenn eines der Ergebnisse gerade ist, sollte das gesamte Ergebnis gerade sein. Betrachten Sie die 4 möglichen Ergebnisse (gerade * gerade = gerade, gerade * ungerade = gerade, ungerade * gerade = gerade, ungerade * ungerade = ungerade). Bei einer ausreichend großen Verteilung sollte die Antwort sogar 75% der Zeit sein.

Ich würde wetten, wenn ich du wäre.

Dieser Kommentar ist eigentlich mehr eine Erklärung dafür, warum Sie keine benutzerdefinierte Zufallsfunktion basierend auf Ihrer Methode implementieren sollten, als eine Diskussion über die mathematischen Eigenschaften von Zufälligkeit.

11
user479885

Wenn Sie Zweifel haben, was mit den Kombinationen Ihrer Zufallszahlen passieren wird, können Sie die Lektionen verwenden, die Sie in der statistischen Theorie gelernt haben.

In der Situation von OP möchte er wissen, was das Ergebnis von X * X = X ^ 2 ist, wobei X eine Zufallsvariable ist, die entlang der Uniform [0,1] verteilt ist. Wir werden die CDF-Technik verwenden, da es sich nur um eine Eins-zu-Eins-Zuordnung handelt.

Da X ~ Uniform [0,1] ist, ist cdf: fX(x) = 1 Wir wollen die Transformation Y <- X ^ 2, also y = x ^ 2 Finden Sie das Inverse x (y): sqrt (y) = x. Dies gibt uns x als Funktion von y . Finden Sie als Nächstes die Ableitung dx/dy: d/dy (sqrt (y)) = 1/(2 sqrt (y))

Die Verteilung von Y wird angegeben als: fY(y) = fX(x (y)) | dx/dy | = 1/(2 Quadratmeter (y))

Wir sind noch nicht fertig, wir müssen die Domäne von Y erhalten. Da 0 <= x <1, 0 <= x ^ 2 <1so liegt Y im Bereich [0, 1) . Wenn Sie prüfen möchten, ob das PDF von Y tatsächlich ein PDF ist, integrieren Sie es über die Domäne: Integrate 1/(2 sqrt (y)) von 0 nach 1 und tatsächlich erscheint es als 1. Außerdem ist zu beachten Die Form der besagten Funktion sieht aus, als wäre das etwas beleidigendes.

Wie für Dinge wie X1 + X2 + ... + Xn(wo Xich ~ Uniform [0,1]) Wir können uns einfach an den zentralen Grenzwertsatz wenden, der für jede Verteilung gilt, deren Momente existieren. Deshalb existiert der Z-Test tatsächlich.

Andere Techniken zum Bestimmen des resultierenden PDF umfassen die Jacobian-Transformation (die verallgemeinerte Version der Cdf-Technik) und die MGF-Technik.

BEARBEITEN: Zur Klarstellung beachten Sie, dass ich über das Verteilung der resultierenden Transformation spreche und nicht über dessen Zufall. Das ist eigentlich für eine separate Diskussion. Auch was ich eigentlich abgeleitet habe, war für (Rand ()) ^ 2. Für Rand () * Rand () ist es viel komplizierter, was in keinem Fall zu einer gleichmäßigen Verteilung irgendeiner Art führt.

10
Wil

Es ist nicht genau offensichtlich, aber Rand() ist in der Regel zufälliger als Rand()*Rand(). Wichtig ist, dass dies für die meisten Anwendungen nicht sehr wichtig ist.

Zum einen erzeugen sie jedoch unterschiedliche Verteilungen. Das ist kein Problem wenn Sie das wollen, aber es ist wichtig. Wenn Sie eine bestimmte Verteilung benötigen, ignorieren Sie die ganze Frage "Was ist zufälliger". Warum ist Rand() eher zufällig?

Der Grund, warum Rand() eher zufällig ist (unter der Annahme, dass er Fließkommazahlen mit dem Bereich [0..1] erzeugt, was sehr häufig vorkommt) ist, dass zwei FP - Zahlen mit multipliziert werden viele Informationen in der Mantisse, am Ende kommt es zu Informationsverlust; Es gibt einfach nicht genug Bit in einem IEEE-Float mit doppelter Genauigkeit, um alle Informationen zu speichern, die in zwei IEEE-Floats mit doppelter Genauigkeit waren, die einheitlich zufällig aus [0..1] ausgewählt wurden, und diese zusätzlichen Informationen gehen verloren. Natürlich ist es nicht so wichtig, da Sie (wahrscheinlich) diese Informationen nicht verwenden würden, aber der Verlust ist real. Es spielt auch keine Rolle, welche Distribution Sie produzieren (d. H. Welche Operation Sie für die Kombination verwenden). Jede dieser Zufallszahlen enthält (bestenfalls) 52 Bit Zufallsinformationen - so viel kann ein IEEE-Double halten - und wenn Sie zwei oder mehr zu einem kombinieren, sind Sie immer noch auf maximal 52 Bit Zufallsinformationen beschränkt.

Die meisten Verwendungszwecke von Zufallszahlen verwenden nicht einmal annähernd so viel Zufall, wie in der Zufallsquelle tatsächlich vorhanden ist. Holen Sie sich einen guten PRNG und machen Sie sich nicht zu viele Sorgen. (Der Grad der "Güte" hängt davon ab, was Sie damit tun; Sie müssen vorsichtig sein, wenn Sie eine Monte-Carlo-Simulation oder -Kryptographie durchführen, ansonsten können Sie wahrscheinlich den Standard PRNG verwenden, da dies normalerweise viel schneller ist.)

9
Donal Fellows

Floating Randoms basieren im Allgemeinen auf einem Algorithmus, der eine ganze Zahl zwischen Null und einem bestimmten Bereich erzeugt. Wenn Sie also Rand () * Rand () verwenden, sagen Sie im Wesentlichen int_Rand () * int_Rand ()/Rand_max ^ 2 - was bedeutet, dass Sie keine Primzahl/Rand_max ^ 2 ausschließen.

Das ändert die randomisierte Verteilung erheblich.

Rand () ist auf den meisten Systemen gleichmäßig verteilt und lässt sich nur schwer vorhersagen, wenn es richtig aussetzt. Verwenden Sie das, es sei denn, Sie haben einen bestimmten Grund, etwas zu berechnen (d. H. Die Verteilung auf eine benötigte Kurve zu bringen).

7
Fordi

Multiplizierende Zahlen würden je nach Computerarchitektur in einem kleineren Lösungsbereich enden.

Wenn das Display Ihres Computers 16 Ziffern enthält, würde Rand() sagen: 0,1234567890123 Multipliziert mit einer zweiten Rand() (0,1234567890123), würde 0.0152415 etwas ergeben .

7
Huub

Die meisten dieser Verteilungen sind darauf zurückzuführen, dass Sie die Zufallszahl einschränken oder normalisieren müssen. 

Wir normalisieren sie so, dass sie alle positiv sind, in einen Bereich passen und sogar in die Einschränkungen der Speichergröße für den zugewiesenen Variablentyp passen.

Mit anderen Worten, da der Zufallsaufruf zwischen 0 und X begrenzt werden muss (X ist die Größenbegrenzung unserer Variablen), haben wir eine Gruppe von "Zufallszahlen" zwischen 0 und X.

Wenn Sie nun die Zufallszahl zu einer anderen Zufallszahl hinzufügen, wird die Summe irgendwo zwischen 0 und 2X liegen ... dies versetzt die Werte von den Edge-Punkten weg (die Wahrscheinlichkeit, zwei kleine Zahlen und zwei große Zahlen zusammen zu addieren, ist sehr klein, wenn) Sie haben zwei Zufallszahlen über einen großen Bereich. 

Stellen Sie sich vor, Sie hätten eine Zahl nahe Null und fügen diese mit einer anderen Zufallszahl hinzu. Sie wird mit Sicherheit größer und wird von 0 weg (dies gilt für große Zahlen und es ist unwahrscheinlich, dass es zwei große Zahlen gibt.) (Zahlen nahe bei X) werden zweimal von der Zufallsfunktion zurückgegeben.

Wenn Sie nun die Zufallsmethode mit negativen und positiven Zahlen (gleichmäßig über die Nullachse) einstellen, wäre dies nicht mehr der Fall.

Sagen Sie zum Beispiel RandomReal({-x, x}, 50000, .01), dann würden Sie eine gleichmäßige Verteilung von Zahlen auf der negativen Seite und eine positive Seite erhalten, und wenn Sie die Zufallszahlen addieren, behalten sie ihre "Zufälligkeit" bei.

Jetzt bin ich mir nicht sicher, was mit der Random() * Random() mit der negativen bis positiven Spanne passieren würde ... das wäre eine interessante Grafik ... aber ich muss jetzt wieder Code schreiben. :-P

3
user479538
  1. More random gibt es nicht. Es ist entweder zufällig oder nicht. Zufall bedeutet "schwer vorhersagen". Es bedeutet nicht nicht deterministisch. Sowohl random () als auch random () * random () sind gleichermaßen zufällig, wenn random () zufällig ist. Die Verteilung ist für die Zufälligkeit unerheblich. Wenn eine ungleichmäßige Verteilung auftritt, bedeutet dies nur, dass einige Werte wahrscheinlicher sind als andere; Sie sind immer noch unvorhersehbar.

  2. Da es sich um Pseudo-Zufälligkeit handelt, sind die Zahlen sehr deterministisch. In Wahrscheinlichkeitsmodellen und Simulationen ist Pseudo-Zufälligkeit jedoch oft ausreichend. Es ist ziemlich bekannt, dass eine komplizierte Erstellung eines Pseudo-Zufallszahlengenerators nur schwer zu analysieren ist. Es ist unwahrscheinlich, dass die Zufälligkeit verbessert wird. Dies führt häufig dazu, dass statistische Tests nicht bestanden werden.

  3. Die gewünschten Eigenschaften der Zufallszahlen sind wichtig: Wiederholbarkeit und Reproduzierbarkeit, statistische Zufälligkeit (normalerweise) gleichmäßig verteilt und eine große Periode sind einige.

  4. Transformationen in Zufallszahlen: Wie jemand sagte, ergibt die Summe von zwei oder mehr gleichförmig verteilten Werten eine Normalverteilung. Dies ist der additive zentrale Grenzwertsatz. Sie gilt unabhängig von der Quelldistribution, solange alle Distributionen unabhängig und identisch sind. Der multiplikative zentrale Grenzwertsatz besagt, dass das Produkt von zwei oder mehr unabhängigen und indentisch verteilten Zufallsvariablen lognormal ist. Das Diagramm, das ein anderer erstellt hat, wirkt exponentiell, ist aber wirklich lognormal. Random () * random () ist also lognormal verteilt (obwohl es möglicherweise nicht unabhängig ist, da Zahlen aus demselben Stream abgerufen werden). Dies kann in einigen Anwendungen wünschenswert sein. In der Regel ist es jedoch besser, eine Zufallszahl zu generieren und in eine logisch normal verteilte Zahl umzuwandeln. Random () * Random () ist möglicherweise schwer zu analysieren.

Weitere Informationen finden Sie in meinem Buch unter www.performorama.org. Das Buch befindet sich im Aufbau, aber das relevante Material ist da. Beachten Sie, dass sich die Kapitel- und Abschnittsnummern mit der Zeit ändern können. Kapitel 8 (Wahrscheinlichkeitstheorie) - Abschnitte 8.3.1 und 8.3.3, Kapitel 10 (Zufallszahlen).

2
Tom

Wir können zwei Zahlenarrays hinsichtlich der Zufälligkeit miteinander vergleichen, indem wir __. Kolmogorov-Komplexität .__ verwenden. Wenn die Zahlenfolge nicht komprimiert werden kann, dann ist dies die zufälligste, die wir in dieser Länge erreichen können ... Ich weiß, dass diese Art der Messung eher eine theoretische Option ist ...

1
HamoriZ

Wenn Sie darüber nachdenken, ist Rand() * Rand()less zufällig als Rand(). Hier ist der Grund.

Im Wesentlichen gibt es die gleiche Anzahl ungerader Zahlen wie gerade Zahlen. Und zu sagen, dass 0,04325 ungerade ist und wie 0,388 gerade ist und 0,4 gerade ist und 0,15 ungerade ist,

Das bedeutet, dass Rand() eine gleich Chance hat, eine gerade oder ungerade Dezimalzahl zu sein.

Auf der anderen Seite sind die Quoten von Rand() * Rand() etwas anders gestapelt .

double a = Rand();
double b = Rand();
double c = a * b;

a und b haben eine 50% ige Chance, gerade oder ungerade zu sein. Wissend, dass

  • gerade * gerade = gerade
  • gerade * ungerade = gerade
  • ungerade * ungerade = ungerade
  • ungerade * gerade = gerade

bedeutet, dass es eine 75% ige Chance gibt, dass c gerade ist, während nur eine 25% ige Chance ungerade ist, was den Wert von Rand() * Rand() vorhersagbarer macht als Rand() und daher weniger zufällig ist.

1
John S.

Verwenden Sie ein lineares Feedback-Schieberegister (LFSR), das ein primitives Polynom implementiert.

Das Ergebnis ist eine Folge von 2 ^ n Pseudozufallszahlen, dh keine Wiederholung in der Folge, wobei n die Anzahl der Bits im LFSR ... ist, was zu einer gleichmäßigen Verteilung führt.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http: //www.xilinx.com/support/documentation/application_notes/xapp052.pdf

Verwenden Sie einen "zufälligen" Startwert, der auf Mikrosekunden Ihrer Computeruhr basiert, oder möglicherweise eine Teilmenge des MD5-Ergebnisses für einige sich ständig ändernde Daten in Ihrem Dateisystem.

Beispielsweise generiert ein 32-Bit-LFSR 2 ^ 32 eindeutige Nummern (nicht wie bei 2), beginnend mit einem gegebenen Startwert. Die Sequenz wird immer in der gleichen Reihenfolge sein, aber der Startpunkt wird (offensichtlich) für einen anderen Samen unterschiedlich sein. Wenn also eine möglicherweise wiederholte Sequenz zwischen den Aussaaten kein Problem darstellt, ist dies möglicherweise gut Wahl.

Ich habe 128-Bit-LFSRs verwendet, um zufällige Tests in Hardwaresimulatoren unter Verwendung eines Seed zu generieren, der die MD5-Werte bei sich ständig ändernden Systemdaten ergibt.

0
johnny

Unter der Annahme, dass Rand() eine Zahl zwischen [0, 1) zurückgibt, ist es offensichtlich, dass Rand() * Rand() gegen 0 tendiert. Dies liegt daran, dass das Multiplizieren von x mit einer Zahl zwischen [0, 1) eine kleinere Zahl als x ergibt. Hier ist die Verteilung von 10000 mehr Zufallszahlen:

google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.Push(Math.random() * Math.random());
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " Rand() * Rand() values between [0, 1)",
    legend: { position: "none" }
  });
}
<script src="https://www.gstatic.com/charts/loader.js"></script>

<div id="chart-1" style="height: 500px">Generating chart...</div>

Wenn Rand() eine ganze Zahl zwischen [x, y] zurückgibt, haben Sie die folgende Verteilung. Beachten Sie die Anzahl der ungeraden vs. geraden Werte:

google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);
document.querySelector("#draw-chart").addEventListener("click", drawChart);

function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function drawChart() {
  var min = Number(document.querySelector("#Rand-min").value);
  var max = Number(document.querySelector("#Rand-max").value);
  if (min >= max) {
    return;
  }
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.Push(randomInt(min, max) * randomInt(min, max));
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " Rand() * Rand() values between [" + min + ", " + max + "]",
    legend: { position: "none" },
    histogram: { bucketSize: 1 }
  });
}
<script src="https://www.gstatic.com/charts/loader.js"></script>

<input type="number" id="Rand-min" value="0" min="0" max="10">
<input type="number" id="Rand-max" value="9" min="0" max="10">
<input type="button" id="draw-chart" value="Apply">

<div id="chart-1" style="height: 500px">Generating chart...</div>

0
Salman A