Schreiben Sie eine wahrhaft inklusive random-Methode für javascript
Javascript-MATH-Objekt hat eine zufällige Methode, die zurückgibt, aus der Menge [0,1) 0-inclusive, 1 exklusive. Gibt es einen Weg, um wieder einen wirklich zufälligen Methode, die beinhaltet 1.
z.B.
var rand = MATH.random()*2;
if(rand > 1)
{
rand = MATH.floor(rand);
}
return rand;
Während dieses gibt immer eine Zahl aus der Menge [0,1] es ist nicht wirklich zufällig.
- definieren zufällig 🙂
- Ich Frage mich, was die Verwendung von insbesondere 1?
- Es ist zufällig, nur eben nicht einheitlich zufällig.
- Entschuldigung, ich meine einheitlich zufällig.
- soweit die Anwendung dieses, nur neugierig 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ob es inclusive der Grenzen sollte keine Rolle spielen; in der Tat, streng genommen, was Sie zu tun versuchen, nicht wirklich sinnvoll. Denken Sie daran, dass unter einer kontinuierlichen Wahrscheinlichkeitsverteilung, ist die Wahrscheinlichkeit, einen bestimmten Wert, ist verschwindend gering sowieso, also mathematisch sprechend, werden Sie nie sehen, den genauen Wert der 1.
Natürlich, in der Welt der Computer, dem Sie die Verteilung der RNG ist nicht wirklich kontinuierlich, so ist es "möglich", auf die Sie stoßen einen bestimmten Wert (was auch immer das bedeutet), sondern die Tatsache, dass Sie sich auf eine Einschränkung, wie die real-zahlen gespeichert sind Hinweise auf Probleme mit Ihrem Ansatz, zu welchem problem Sie versuchen zu lösen.
Zurückkehren [0,1] inklusive:
Erklärung: Wenn der erste Aufruf der Funktion random() liefert 0, 1 zurück. Ansonsten rufen Sie random erneut, die [0,1). Daher wird es wieder [0,1] all inclusive.
Den
Math.random
- Funktion gibt eine Zufallszahl zwischen 0 und 1, wobei 0 ist inclusive und 1 exklusive. Dies bedeutet, dass der einzige Weg, um richtig verteilen die Zufallszahlen als Ganzzahlen im Intervall ist eine exklusive Obere Grenze.Anzugeben inclusive die Obere Grenze, die Sie gerade hinzufügen, um es, um es exklusiv in der Berechnung. Diese verteilen die Zufallszahlen korrekt zwischen 7 und 12 inklusive:
Du willst auch 1?
Aber ich denke, das ist eine jener Fragen, die Hinweise auf andere Probleme. Warum müssen Sie 1? Wahrscheinlich gibt es ein besserer Weg, es zu tun.
Von dem, was ich sehen kann, aus der JavaScript-Konsole in Chrome
Math.random()
erzeugt eine Zahl von 0 bis 0.9999999999999999. Unter Berücksichtigung dieser Tatsache, können Sie bekommen, was Sie wollen, durch hinzufügen eines Modifikators. Zum Beispiel, hier ist eine Funktion, die Ihnen quasi-random-float zwischen 0 und 1, wobei 1 inklusive:Können Sie versuchen, diese in der Konsole eingeben
0.9999999999999999*(1+2.5e-16)
-- wird es wieder genau 1. Sie können diese weiter und liefert ein float zwischen 0 und 1024 (inklusive) mit dieser Funktion:Wahrscheinlich gibt es einen effizienteren Algorithmus zu haben irgendwo.
Da diese Frage wurde noch mal gefragt, und ich wusste nicht, Lesen Sie diesen Ansatz hier werde ich hinzufügen, eine andere Antwort.
IMO das beste, was Sie tun können, ohne zu viel Aufwand wäre:
exklusiv:
diese gar nicht einzuführen, ist ein Fehler, da wir gerade ausgeschlossen, die Möglichkeit der Rückkehr
0
jeder andere Wert zwischen 0 und 1 die gleiche Wahrscheinlichkeitinclusive:
nur darüber im klaren sein, wie winzig der "Fehler" ist:
0
oder eine1
ist1 /Math.pow(2, 54)
oder über5.55e-17
0
und1
ist1 /Math.pow(2, 53)
oder über11.1e-17
und das ganze random-Funktion wäre:
Edit: ich bin mir nicht sicher, ob ich nicht einen Fehler machen, aber sollte dann nicht die Wahrscheinlichkeit behoben werden, die auf den integrativen Ansatz, wenn ich ein bisschen um die Nullen und Einsen, und daher doppelte Ihrer Wahrscheinlichkeit:
Nachtrag:
Sich ein Blick auf die
java.util.Random
source-code enthalten mit dem Vertrieb von Oracle JDK 7 ("Copyright (c) 1995, 2010, Oracle und/oder seinen verbundenen Unternehmen. Alle Rechte vorbehalten. ORACLE-PROPRIETARY/CONFIDENTIAL. Die Nutzung unterliegt der Lizenzvereinbarung") zeigt diesen einfachen code:So, für
nextFloat()
:Siehe auch IEEE floating point und Floating-Point-Arithmetik auf der JVM.
In der Javadoc-Kommentare für " next() ist:
In der Javadoc-Kommentare für
nextFloat()
ist: