In der Dokumentation heißt es, dass es eine Chance uniform(0,1)
gibt, die Werte 0
und zu generieren 1
.
Ich bin uniform(0, 1)
10000 Mal gelaufen , aber es hat nie Null produziert. Auch im Fall von uniform(0, 0.001)
.
Kann random.uniform(0,1)
jemals erzeugen 0
oder 1
?
python
random
uniform-distribution
Venkatesh Gandi
quelle
quelle
X ~ U(0,1)
, dann dasP(X=x)
ist fast sicher 0, für alle Werte von x. (Dies liegt daran, dass das Intervall unendlich viele mögliche Werte enthält.) Wenn Sie genau 0 oder 1 suchen, sollten Sie eine andere Funktion verwenden - zum Beispielrandom.choice
random.uniform
?Math.random()
funktioniert das beispielsweise in JavaScript).random.uniform(0, 1)
Antworten:
uniform(0, 1)
kann produzieren0
, aber es wird nie produzieren1
.Die Dokumentation sagt Ihnen , dass der Endpunkt
b
könnte in den Werten erzeugt aufgenommen werden:Denn
uniform(0, 1)
die Formel0 + (1-0) * random()
, vereinfacht auf1 * random()
, müsste in der Lage sein,1
genau zu produzieren . Das würde nur passieren, wennrandom.random()
1.0exactly. However,
random ()*never* produces
1.0` ist.Zitieren der
random.random()
Dokumentation :Die Notation
[..., ...)
bedeutet, dass der erste Wert Teil aller möglichen Werte ist, der zweite jedoch nicht.random.random()
wird höchstens Werte sehr nahe an erzeugen1.0
. Pythonsfloat
Typ ist ein IEEE 754 base64-Gleitkommawert , der eine Anzahl von binären Brüchen (1/2, 1/4, 1/5 usw.) codiert , aus denen der Wert besteht, und der erzeugte Wertrandom.random()
ist einfach die Summe von a zufällige Auswahl dieser 53 solcher Fraktionen von2 ** -1
(1/2) bis2 ** -53
(1/9007199254740992).Da es jedoch Werte sehr nahe produzieren kann
1.0
, zusammen mit Rundungsfehlern , die auftreten , wenn Sie mehrfach Punkt nubmers schwimmen, Sie können produzierenb
für einige Werte vona
undb
. Aber0
und1
gehören nicht zu diesen Werten.Beachten Sie, dass
random.random()
dies 0,0 erzeugen kann und dahera
immer in den möglichen Werten fürrandom.uniform()
(a + (b - a) * 0 == a
) enthalten ist. Da es2 ** 53
unterschiedliche Werte gibt,random.random()
die erzeugen können (alle möglichen Kombinationen dieser 53 binären Brüche), gibt es nur eine 1-in-2 ** 53
Chance (also 1 in 9007199254740992), dass dies jemals passiert.Der höchstmögliche Wert, der erzeugt werden
random.random()
kann, ist also1 - (2 ** -53)
: Wählen Sie einfach einen Wert, der klein genug istb - a
, damit die Rundung einsetzt, wenn sie mit höherenrandom.random()
Werten multipliziert wird . Je kleinerb - a
ist, desto größer ist die Wahrscheinlichkeit, dass dies geschieht:Wenn Sie treffen
b = 0.0
, haben wir 1023 Mal geteilt. Der obige Wert bedeutet, dass wir nach 1019 Teilungen Glück hatten. Der höchste Wert, den ich bisher gefunden habe (Ausführen der obigen Funktion in einer Schleife mitmax()
), ist8.095e-320
(1008 Teilungen), aber es gibt wahrscheinlich höhere Werte. Es ist alles ein Glücksspiel. :-)Es kann auch passieren, wenn es nicht viele diskrete Schritte zwischen
a
und gibtb
, wie wenna
undb
einen hohen Exponenten haben und daher weit auseinander liegen. Gleitkommawerte sind immer noch nur Näherungswerte, und die Anzahl der Werte, die sie codieren können, ist endlich. Zum Beispiel gibt es nur 1 binären Bruchteil der Differenz zwischensys.float_info.max
undsys.float_info.max - (2 ** 970)
, so dass eine 50-50-Chancerandom.uniform(sys.float_info.max - (2 ** 970), sys.float_info.max)
ergibtsys.float_info.max
:quelle
"Mehrmals" ist nicht genug. 10.000 sind nicht genug.
random.uniform
wählt aus 2 ^ 53 (9.007.199.254.740.992) verschiedene Werte aus. Sie interessieren sich für zwei von ihnen. Daher sollten Sie damit rechnen, mehrere Billiarden Zufallswerte zu generieren , bevor Sie einen Wert erhalten, der genau 0 oder 1 ist. Es ist also möglich, aber es ist sehr wahrscheinlich, dass Sie ihn niemals beobachten werden.quelle
uniform(0, 1)
es ist unmöglich ,1
als Ergebnis zu produzieren . Das liegt daran, dass die Funktion einfach definiert istdef uniform(a, b): return a + (b - a) * random()
undrandom()
niemals produzieren kann1.0
.Sie können versuchen, eine Schleife zu generieren, die die Anzahl der Iterationen zählt, die erforderlich sind, um eine exakte 0 anzuzeigen (nicht).
Wie Hobbs feststellte, beträgt die Menge der
uniformly
abgetasteten Werte 9.007.199.254.740.992. Dies bedeutet, dass die Wahrscheinlichkeit, eine 0 zu sehen, genau 1 / 9,007,199,254,740,992 beträgt. Was im Allgemeinen und Aufrundung bedeutet, dass Sie durchschnittlich 10 Billiarden Proben benötigen , um eine 0 zu finden. Natürlich finden Sie sie möglicherweise bei Ihren ersten 10 Versuchen oder nie.Das Abtasten einer 1 ist unmöglich, da das für die Werte definierte Intervall mit einer Klammer geschlossen wird und daher 1 nicht enthält.
quelle
Sicher. Sie waren bereits auf dem richtigen Weg, es
uniform(0, 0.001)
stattdessen zu versuchen . Beschränken Sie die Grenzen einfach so weit, dass dies früher geschieht.quelle