Gibt es Unterschiede zwischen random() * random()
und random() ** 2
? random()
gibt einen Wert zwischen 0 und 1 aus einer gleichmäßigen Verteilung zurück.
Beim Testen beider Versionen von zufälligen Quadratzahlen bemerkte ich einen kleinen Unterschied. Ich erstellte 100000 zufällige Quadratzahlen und zählte, wie viele Zahlen in jedem Intervall von 0,01 sind (0,00 bis 0,01, 0,01 bis 0,02, ...). Es scheint, dass diese Versionen der quadrierten Zufallszahlengenerierung unterschiedlich sind.
Wenn Sie eine Zufallszahl quadrieren, anstatt zwei Zufallszahlen zu multiplizieren, verwenden Sie eine Zufallszahl, aber ich denke, die Verteilung sollte gleich bleiben. Gibt es wirklich einen Unterschied? Wenn nicht, warum zeigt mein Test einen Unterschied?
Ich erzeuge zwei zufällige verteilte Verteilungen für random() * random()
und eine für random() ** 2
wie folgt:
was
ergibt %Vor%Der erwartete zufällige Fehler ist der Unterschied in den ersten beiden:
%Vor%Aber der Unterschied zwischen dem ersten und dritten ist viel größer, was andeutet, dass die Verteilungen verschieden sind:
%Vor%Hier sind einige Diagramme:
Alle Möglichkeiten für random() * random()
:
Die x-Achse ist eine Zufallsvariable, die nach rechts ansteigt, und die y-Achse ist eine andere, die nach oben ansteigt.
Sie können sehen, dass bei niedrigen Werten das Ergebnis niedrig ist und beide hoch sein müssen, um ein hohes Ergebnis zu erhalten.
Wenn der einzige Entscheider eine einzelne Achse ist, wie im Fall random() ** 2
, erhalten Sie
In diesem Fall ist es viel wahrscheinlicher, einen sehr dunklen (großen) Wert zu erhalten, da das gesamte obere Bild dunkel ist, nicht nur eine Ecke.
Wenn Sie beides linearisieren, mit random() * random()
oben:
Sie sehen, dass die Verteilungen tatsächlich verschieden sind.
Code:
%Vor% Sie können das auch mathematisch angehen. Die Wahrscheinlichkeit, einen Wert kleiner als x
zu bekommen, mit 0 ≤ x ≤ 1
ist
random()²
: als die Wahrscheinlichkeit, dass der Zufallswert niedriger als x
ist, ist die Wahrscheinlichkeit, dass random()² < x
.
random() · random()
: Wenn die erste Zufallsvariable r
und die zweite R
ist, können wir die Wahrscheinlichkeit dafür finden, dass Rr < x
mit einer festen R
:
Also wollen wir
%Vor% Wie wir sehen können, √x ≠ x(1 - ln R)
.
Diese Verteilungen erscheinen als:
Die y-Achse gibt die Wahrscheinlichkeit an, dass die Linie ( random()²
oder random() · random()
) kleiner als die x-Achse ist.
Wir sehen, dass für die random() · random()
die Wahrscheinlichkeit großer Zahlen wesentlich geringer ist.
Ich denke, die aufschlussreichste Sache ist die Unterscheidung ( ½x ^ -½
und - ln x
) und die Wahrscheinlichkeitsdichtefunktionen:
Dies zeigt die Wahrscheinlichkeit jedes x
relativ. Daher ist die Wahrscheinlichkeit, dass x
groß ist ( > 0.5
) ungefähr zweimal für die random()²
Variante.
Lassen Sie uns das Problem etwas vereinfachen. Ziehen Sie in Betracht, zwei Würfel zu werfen und das Ergebnis zu multiplizieren, indem Sie einen Würfel werfen und ihn quadrieren. Im ersten Fall haben Sie eine Chance von 1 zu 36, eine doppelte 1 zu werfen, also eine Chance von 1 zu 36, dass das Produkt 1 ist. Auf der anderen Seite hat der zweite Fall offensichtlich eine Chance von 1 zu 6, dass das Quadrat 1 ist gilt für eine doppelte 6, so dass die Extreme bei der Quadrierung viel wahrscheinlicher sind.
Das gleiche gilt, wenn Sie zufällige Gleitkommazahlen verwenden: Es ist viel weniger wahrscheinlich, dass Sie zwei zufällige Werte an den Extremen erhalten, als einen einzelnen Wert, so dass sehr kleine oder sehr große Werte dann viel häufiger beim Quadrieren auftreten wenn zwei unabhängige Werte multipliziert werden.
Tags und Links python random random-sample