Produziert die Rand-Funktion jemals Werte von 0 oder 1 in MATLAB / Octave?

8

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?

    
Cherry 23.04.2015, 04:19
quelle

4 Antworten

7

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:

zu erhalten %Vor%

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.

    
rayryeng 23.04.2015, 04:25
quelle
5

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.

    
Sam Roberts 23.04.2015 13:16
quelle
4

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 % 0 erzeugen könnte, würde es sie mit einer Wahrscheinlichkeit erzeugen, die so klein ist, dass Sie "niemals" diese Werte sehen würden.

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

    
Luis Mendo 23.04.2015 06:45
quelle
2

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.

    
brodoll 23.04.2015 04:23
quelle

Tags und Links