Ich suche nach einer Funktion, die zufällige Werte zwischen 0
und 1
inklusive generiert. Ich habe 120.000 Zufallswerte erzeugt, indem ich rand()
function in der Oktave benutzt habe, aber nicht einmal die Werte 0
oder 1
als Ausgabe erhalten habe. Produziert rand()
jemals solche Werte? Wenn nicht, gibt es eine andere Funktion, die ich verwenden kann, um das gewünschte Ergebnis zu erzielen?
Wenn Sie die Dokumentation von rand
sowohl in Octave als auch in MATLAB , es ist ein offenes Intervall zwischen (0,1)
, also nein, sollte es nicht erzeuge die Zahlen 0 oder 1.
Sie können jedoch möglicherweise eine Menge zufälliger Ganzzahlen generieren und die Werte dann so normalisieren, dass sie zwischen [0,1]
liegen. Also vielleicht etwas wie randi
( MATLAB docs , Octave docs ), wo Ganzzahlen von 1 bis zu einem bestimmten Maximum generiert werden. Definieren Sie diese maximale Anzahl, subtrahieren Sie sie dann um 1, und dividieren Sie sie mit diesem Offset-Maximum, um Werte zwischen [0,1]
inklusive:
Wenn Sie möchten, dass dies mehr wie rand
, aber einschließlich 0 und 1 geschieht, sollten Sie die Variable max_num
ziemlich groß machen.
rand
erzeugt Zahlen aus dem offenen Intervall (0,1)
, das nicht 0 oder 1 enthält, also sollten Sie diese Werte niemals erhalten. Dies wurde in früheren Versionen besser dokumentiert, aber Es wird immer noch im Hilfetext für rand
(Typ help rand
statt doc rand
) angegeben.
Da es jedoch Doppelungen erzeugt, gibt es nur eine endliche Anzahl von Werten, die tatsächlich erzeugt werden. Die genaue Menge hängt vom verwendeten RNG-Algorithmus ab. Bei Mersenne twister, dem Standardalgorithmus, sind die möglichen Werte alle Vielfache von 2 ^ (- 53) innerhalb des offenen Intervalls (0,1)
. (Siehe doc RandStream.list
und dann "Auswahl eines Zufallszahlengenerators" für Informationen zu anderen Generatoren).
Beachten Sie, dass 2 ^ (- 53) eps / 2 ist. Es entspricht also dem Zeichnen aus dem geschlossenen Intervall [2^(-53), 1-2^(-53)]
oder [eps/2, 1-eps/2]
.
Sie können dieses Intervall auf [0,1]
skalieren, indem Sie eps / 2 subtrahieren und durch 1-eps dividieren. (Verwenden Sie format hex
, um genügend Genauigkeit anzuzeigen, um dies auf der Bit-Ebene zu überprüfen.)
So sollte x = (rand-eps/2)/(1-eps)
Ihnen Werte für das geschlossene Intervall [0,1]
geben.
Aber ich sollte ein wenig Vorsicht walten lassen: Sie haben sich sehr viel Mühe gegeben, dafür zu sorgen, dass die Ausgabe von rand
eine angemessene Verteilung eines beliebigen Double innerhalb von (0,1)
ergibt, und ich glaube nicht, dass Sie Sie erhalten dieselben schönen Eigenschaften für [0,1]
, wenn Sie die von mir vorgeschlagene Skalierung anwenden. Mein Wissen über Fließkomma-Mathematik und RNGs erklärt nicht, warum oder was Sie dagegen tun sollten.
Mathematisch , wenn Sie aus einer (kontinuierlichen) gleichmäßigen Verteilung im geschlossenen Intervall [0 1] Werte 0 und 1 (oder einen beliebigen Wert) abtasten habe die Wahrscheinlichkeit streng 0.
Programmatisch ,
Wenn Sie einen Zufallsgenerator haben, der Werte von double
type im geschlossenen Intervall [0 1] erzeugt, ist die Wahrscheinlichkeit, den Wert 0 oder 1 zu erhalten, nicht Null , aber es ist so klein, dass es vernachlässigt werden kann
Wenn der Zufallsgenerator Werte aus dem offenen Intervall (0, 1) erzeugt, ist die Wahrscheinlichkeit, einen Wert 0 oder 1 zu erhalten, streng null .
Also ist die Wahrscheinlichkeit entweder streng Null oder so klein, dass sie vernachlässigt werden kann. Daher sollten Sie sich keine Sorgen machen: In beiden Fällen ist die Wahrscheinlichkeit für praktische Zwecke gleich Null. Selbst wenn rand
vom Typ (1) wäre und somit %
Klingt das merkwürdig? Nun, das passiert mit jeder Nummer. Sie sehen "nie", dass 1
auch genau 1/3 ausgibt. Es gibt so viele mögliche Ausgaben, die alle gleich wahrscheinlich sind, dass die Wahrscheinlichkeit einer gegebenen Ausgabe praktisch Null ist
Ich habe es gerade versucht:
%Vor%Habe mir 0 nicht streng gegeben, also pass auf Gleitkommaoperationen auf.
Bearbeiten
Obwohl ich gesagt habe, pass auf Gleitkommaoperationen auf Ich bin darauf reingefallen. Wie @eigenchris darauf hingewiesen hat:
%Vor%Es ergibt eine schwebende Zahl close für eins, nicht gleich, wie Sie jetzt sehen können, nachdem Sie die Genauigkeit geändert haben, wie @rayryeng vorgeschlagen hat.