Ist es möglich, eine Zufallszahl zwischen 1 und 100 zu erhalten und die Ergebnisse hauptsächlich im Bereich von 40 bis 60 zu halten? Ich meine, es wird selten außerhalb dieses Bereichs liegen, aber ich möchte, dass es hauptsächlich innerhalb dieses Bereichs liegt ... Ist es mit JavaScript / jQuery möglich?
Im Moment benutze ich nur das Basic Math.random() * 100 + 1
.
javascript
algorithm
random
numbers
Darryl Huffman
quelle
quelle
Antworten:
Am einfachsten wäre es, zwei Zufallszahlen von 0 bis 50 zu generieren und zu addieren.
Dies ergibt eine Verteilung, die in Richtung 50 voreingenommen ist, auf die gleiche Weise, wie zwei Würfel in Richtung 7 gewürfelt werden.
In der Tat können Sie durch Verwendung einer größeren Anzahl von "Würfeln" (wie @Falco vorschlägt) eine Glockenkurve näher kommen:
JSFiddle: http://jsfiddle.net/797qhcza/1/
quelle
Sie haben hier einige gute Antworten, die spezifische Lösungen geben; Lassen Sie mich für Sie die allgemeine Lösung beschreiben. Das Problem ist:
Die allgemeine Lösung für dieses Problem besteht darin, die Quantilfunktion Ihrer gewünschten Verteilung zu berechnen und dann die Quantilfunktion auf die Ausgabe Ihrer einheitlichen Quelle anzuwenden.
Die Quantilfunktion ist die Umkehrung des Integrals Ihrer gewünschten Verteilungsfunktion . Die Verteilungsfunktion ist die Funktion, bei der die Fläche unter einem Teil der Kurve gleich der Wahrscheinlichkeit ist, dass sich das zufällig ausgewählte Element in diesem Teil befindet.
Ich gebe hier ein Beispiel dafür:
http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/
Der Code dort ist in C #, aber die Prinzipien gelten für jede Sprache. Es sollte einfach sein, die Lösung an JavaScript anzupassen.
quelle
Das Aufnehmen von Zahlenfeldern usw. ist nicht effizient. Sie sollten eine Zuordnung vornehmen, die eine Zufallszahl zwischen 0 und 100 annimmt, und der gewünschten Verteilung zuordnen. In Ihrem Fall könnten Sie also eine Verteilung mit den meisten Werten in der Mitte Ihres Bereichs erhalten.
f(x)=-(1/25)x2+4x
quelle
x
zwischen 0 und 100 (aus dieser Frage entnommen ):y = (Math.sin(2 * Math.PI * (x/100 - 1/4)) + 1) / 2
Ich könnte so etwas wie eine "Chance" einrichten, dass die Nummer "außerhalb der Grenzen" sein darf. In diesem Beispiel beträgt die Wahrscheinlichkeit 20%, dass die Zahl 1-100 beträgt, andernfalls 40-60:
Geige: http://jsfiddle.net/kbv39s9w/
quelle
Ich musste dieses Problem vor einigen Jahren lösen und meine Lösung war einfacher als jede andere Antwort.
Ich habe 3 Zufälle zwischen den Grenzen generiert und sie gemittelt. Dies zieht das Ergebnis in Richtung Zentrum, lässt es jedoch vollständig möglich, die Extremitäten zu erreichen.
quelle
BellFactor
von 3 verwenden.Es sieht dumm aus, aber Sie können Rand zweimal verwenden:
quelle
Sicher ist es möglich. Machen Sie eine zufällige 1-100. Wenn die Zahl <30 ist, generieren Sie eine Zahl im Bereich von 1 bis 100, wenn nicht im Bereich von 40 bis 60.
quelle
Es gibt viele verschiedene Möglichkeiten, solche Zufallszahlen zu generieren. Eine Möglichkeit besteht darin, die Summe mehrerer einheitlicher Zufallszahlen zu berechnen. Wie viele Zufallszahlen Sie summieren und wie hoch ihr Bereich ist, bestimmt, wie die endgültige Verteilung aussehen wird.
Je mehr Zahlen Sie zusammenfassen, desto stärker ist die Tendenz zur Mitte hin. Die Verwendung der Summe von 1 Zufallszahl wurde bereits in Ihrer Frage vorgeschlagen, ist jedoch, wie Sie bemerken, nicht auf die Mitte des Bereichs ausgerichtet. Andere Antworten haben vorgeschlagen, die Summe von 2 Zufallszahlen oder die Summe von 3 Zufallszahlen zu verwenden .
Sie können noch mehr Vorurteile in Richtung der Mitte des Bereichs erzielen, indem Sie die Summe von mehr Zufallszahlen nehmen. Im Extremfall könnte man die Summe von 99 Zufallszahlen nehmen, die jeweils entweder 0 oder 1 sind. Das wäre eine Binomialverteilung. (Binomialverteilungen können in gewissem Sinne als diskrete Version von Normalverteilungen angesehen werden). Dies kann theoretisch immer noch den gesamten Bereich abdecken, ist jedoch so stark auf das Zentrum ausgerichtet, dass Sie niemals erwarten sollten, dass es die Endpunkte erreicht.
Dieser Ansatz bedeutet, dass Sie genau festlegen können, wie viel Voreingenommenheit Sie möchten.
quelle
Was ist mit so etwas:
So wie ich es codiert haben können Sie ein paar Variablen setzen:
Schleifen = Anzahl der Ergebnisse
versucht = Anzahl , wie oft die Funktion versucht , eine Zahl zwischen 40-60 zu erhalten , bevor es stoppt durch die while - Schleife laufen
Zusätzlicher Bonus: Es verwendet do while !!! Großartigkeit von seiner besten Seite
quelle
Sie können eine Funktion schreiben , die Zufallswerte abbildet zwischen
[0, 1)
bis[1, 100]
nach Gewicht. Betrachten Sie dieses Beispiel:Hier wird der Wert
0.95
dem Wert zwischen zugeordnet[61, 100]
.In der Tat haben wir
.05 / .1 = 0.5
, was, wenn abgebildet[61, 100]
, ergibt81
.Hier ist die Funktion:
quelle
Hier ist eine gewichtete Lösung bei 3/4 40-60 und 1/4 außerhalb dieses Bereichs.
quelle
Ok, also habe ich beschlossen, eine weitere Antwort hinzuzufügen, da ich der Meinung war, dass meine letzte Antwort sowie die meisten Antworten hier eine halbstatistische Methode verwenden, um eine Ergebnisrendite vom Typ Glockenkurve zu erhalten. Der Code, den ich unten gebe, funktioniert genauso wie beim Würfeln. Daher ist es am schwierigsten, 1 oder 99 zu bekommen, aber am einfachsten, 50 zu bekommen.
quelle
Ich würde empfehlen, die Beta-Distribution zu verwenden zu verwenden, um eine Zahl zwischen 0 und 1 zu generieren und sie dann zu vergrößern. Es ist sehr flexibel und kann viele verschiedene Formen von Verteilungen erstellen.
Hier ist ein schneller und schmutziger Sampler:
quelle
quelle
Die beste Lösung für dieses Problem ist die von BlueRaja - Danny Pflughoeft vorgeschlagene, aber ich denke, eine etwas schnellere und allgemeinere Lösung ist ebenfalls erwähnenswert.
Wenn ich Zufallszahlen (Zeichenfolgen, Koordinatenpaare usw.) generieren muss, die die beiden Anforderungen von erfüllen
Normalerweise beginne ich damit, ein Array von Zahlen (Zeichenfolgen, Koordinatenpaare usw.) zu erstellen, das die Anforderung erfüllt (in Ihrem Fall: ein Array von Zahlen, die die wahrscheinlicheren mehrmals enthalten.), Und wähle dann ein zufälliges Element dieses Arrays aus. Auf diese Weise müssen Sie die teure Zufallsfunktion nur einmal pro Artikel aufrufen.
quelle
Verteilung
Lösung
Generische Lösung
quelle
Sie können eine Hilfs-Zufallszahl verwenden, um Zufallszahlen in 40-60 oder 1-100 zu generieren:
quelle
Wenn Sie die
gaussian
Funktion verwenden können, verwenden Sie sie. Diese Funktion gibt die normale Nummer mitaverage 0
und zurücksigma 1
.95% dieser Zahl sind innerhalb
average +/- 2*sigma
. Deinaverage = 50
undsigma = 5
soquelle
Der beste Weg, dies zu tun, besteht darin, eine Zufallszahl zu generieren, die gleichmäßig in einem bestimmten Satz von Zahlen verteilt ist, und dann eine Projektionsfunktion auf den Satz zwischen 0 und 100 anzuwenden, bei der die Projektion mit größerer Wahrscheinlichkeit die gewünschten Zahlen trifft.
Normalerweise besteht der mathematische Weg, dies zu erreichen, darin, eine Wahrscheinlichkeitsfunktion der gewünschten Zahlen zu zeichnen. Wir könnten die Glockenkurve verwenden, aber zur einfacheren Berechnung arbeiten wir einfach mit einer umgedrehten Parabel.
Lassen Sie uns eine Parabel so machen, dass ihre Wurzeln bei 0 und 100 liegen, ohne sie zu verzerren. Wir erhalten die folgende Gleichung:
Jetzt ist der gesamte Bereich unter der Kurve zwischen 0 und 100 repräsentativ für unseren ersten Satz, in dem die Zahlen generiert werden sollen. Dort ist die Generation völlig zufällig. Wir müssen also nur die Grenzen unseres ersten Satzes finden.
Die Untergrenze ist natürlich 0. Die Obergrenze ist das Integral unserer Funktion bei 100
Wir wissen also, dass wir irgendwo zwischen 0 und 166.666 eine Zahl generieren müssen. Dann müssen wir einfach diese Zahl nehmen und auf unseren zweiten Satz projizieren, der zwischen 0 und 100 liegt.
Wir wissen, dass die Zufallszahl, die wir generiert haben, ein Integral unserer Parabel mit einer Eingabe x zwischen 0 und 100 ist. Das bedeutet, dass wir einfach annehmen müssen, dass die Zufallszahl das Ergebnis von F (x) ist, und nach x auflösen müssen.
In diesem Fall ist F (x) eine kubische Gleichung, und in der Form
F(x) = ax^3 + bx^2 + cx + d = 0
sind die folgenden Aussagen wahr:Wenn Sie dies nach x lösen, erhalten Sie die tatsächliche Zufallszahl, nach der Sie suchen. Diese liegt garantiert im Bereich [0, 100] und hat eine viel höhere Wahrscheinlichkeit, nahe am Zentrum als an den Kanten zu liegen.
quelle
Diese Antwort ist wirklich gut . Aber ich möchte Implementierungsanweisungen (ich bin nicht in JavaScript, also hoffe ich, dass Sie verstehen) für eine andere Situation veröffentlichen.
Angenommen, Sie haben Bereiche und Gewichte für jeden Bereich:
Anfängliche statische Informationen können zwischengespeichert werden:
Boundary[n] = Boundary[n - 1] + weigh[n - 1]
undBoundary[0] = 0
. Probe hatBoundary = {0, 1, 3, 103, 108}
Zahlengenerierung:
N
aus dem Bereich [0, Summe aller Gewichte].for (i = 0; i < size(Boundary) && N > Boundary[i + 1]; ++i)
i
Bereich und generieren Sie eine Zufallszahl in diesem Bereich.Zusätzlicher Hinweis für Leistungsoptimierungen. Bereiche müssen weder in aufsteigender noch in absteigender Reihenfolge geordnet werden. Für eine schnellere Reichweite sollte der Suchbereich mit dem höchsten Gewicht an erster Stelle und einer mit dem niedrigsten Gewicht an letzter Stelle stehen.
quelle