generieren von Zufallszahlen innerhalb eines Bereichs mit unterschiedlichen Wahrscheinlichkeiten
Wie kann ich eine Zufallszahl erzeugen, die zwischen A = 1 und B = 10, wobei jede Zahl hat eine andere Wahrscheinlichkeit?
Beispiel: Anzahl /Wahrscheinlichkeit
1 - 20%
2 - 20%
3 - 10%
4 - 5%
5 - 5%
...und so weiter.
Ich bin mir bewusst, dass einige hartcodierte Problemumgehungen, die leider nicht mit größeren Bereichen, zum Beispiel A = 1000 und B = 100000.
Angenommen, wir haben einen
Rand()
Methode gibt eine Zufallszahl R, 0 < R < 1, kann mir jemand die post ein code-Beispiel, mit einer richtigen Art und Weise, dies zu tun ? prefferable in c# /java /actionscript.
- Können Sie beschreiben, wie Sie planen, geben Sie die Wahrscheinlichkeiten im Zusammenhang mit der 99001 Werte im Bereich [1000, 100000]? Nur um eine Idee zu bekommen, was Ihre Erwartungen sind. Auch, was sind Ihre Speicher-und Zeitbeschränkungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bauen ein array von 100 Integer-zahlen und füllen Sie es mit 20 1, 20 2, 10 3, 5 4, 5 5 s usw. Dann einfach nach dem Zufallsprinzip wählen Sie ein Element aus dem array.
Dies funktioniert gut, wenn die Anzahl der Elemente relativ klein ist, und Ihre Präzision ist nicht zu streng. Das heißt, wenn Sie wollte 4.375% 7, dann brauchen Sie einen viel größeren array.
Es ist ein eleganter Algorithmus zurückzuführen, die von Knuth A. J. Walker (Electronics Letters 10, 8 (1974), 127-128; ACM Trans. Mathematik-Software 3 (1977), 253-256).
Die Idee ist, dass wenn man insgesamt k * n Kugeln aus n verschiedenen Farben, dann ist es möglich, verteilen Sie die Bälle in n Container, so dass container nicht. i enthält Kugeln der Farbe i und höchstens eine andere Farbe. Der Beweis ist durch Induktion nach n. Für die Induktion Schritt wählen Sie die Farbe mit der geringsten Anzahl von Kugeln.
In deinem Beispiel n = 10. Multiplizieren Sie die Wahrscheinlichkeiten, mit einem geeigneten m, so dass Sie alle zahlen. Ja, vielleicht ist m = 100 und Sie haben 20 Bälle Farbe 0, 20 Kugeln der Farbe 1, 10 Kugeln der Farbe 2, 5 Kugeln der Farbe 3, etc. Also k = 10.
Nun erzeugen Sie eine Tabelle der dimension n mit jedem Eintrag wird eine Wahrscheinlichkeit (die ration von Kugeln der Farbe, die ich vs die andere Farbe) und die andere Farbe.
Zur Generierung einer zufälligen ball, generieren eine zufällige Gleitkomma-Zahl r im Bereich [0, n). Lass ich die ganzzahligen Teil (Boden, r) und x die überschüssige (r – i).
Der Algorithmus hat den Vorteil, dass für jedes random-ball-machen Sie nur einen einzigen Vergleich.
Lassen Sie mich ein Beispiel (gleiche wie Knuth).
Betrachten zu simulieren, warf ein paar Würfel.
Also P(2) = 1/36, P(3) = 2/36, P(4) = 3/36, P(5) = 4/36, P(6) = 5/36, P(7) = 6/36, P(8) = 5/36, P(9) = 4/36, P(10) = 3/36, P(11) = 2/36, P(12) = 1/36.
Multiplizieren von 36 * 11 zu bekommen 393 Kugeln, 11 der Farbe 2, 22 in der Farbe 3, 33 der Farbe 4, ..., 11 Farbe 12.
Wir haben k = 393 /11 = 36.
Tabelle[2] = (11/36, Farbe 4)
Tabelle[12] = (11/36, Farbe 10)
Tabelle[3] = (22/36, Farbe 5)
Tabelle[11] = (22/36, Farbe 5)
Tabelle[4] = (8/36, Farbe 9)
Tabelle[10] = (8/36, Farbe 6)
Tabelle[5] = (16/36, Farbe 6)
Tabelle[9] = (16/36, Farbe 8)
Tabelle[6] = (7/36, Farbe 8)
Tabelle[8] = (6/36, Farbe 7)
Tabelle[7] = (36/36, Farbe 7)
Angenommen, Sie haben eine Funktion
p(n)
, die Ihnen die gewünschte Wahrscheinlichkeit für eine zufällige Nummer:Eine schnellere Möglichkeit zum erstellen eines array von (B - A) * 100 Elemente, und füllen Sie es mit zahlen von A bis B, so dass das Verhältnis der Anzahl der jedes Element tritt in den Arrays die Größe des Arrays ist dessen Wahrscheinlichkeit. Sie können dann erzeugen Sie eine einheitliche Zufallszahl, um einen index in das array und direkt den Zugriff auf das array, um Ihre Zufallszahl.
if r > p(i)
. Aber das ist nicht richtig. Wenn 1 und 2 beide scheinen mit 20% Wahrscheinlichkeit, Sie werden immer wieder nur einer von Ihnen und die anderen nie.Karte Ihre uniform zufällige Ergebnisse der erforderlichen Ausgaben gemäß den Wahrscheinlichkeiten.
E. g., für dein Beispiel:
Hier ist eine Implementierung von Knuth ' s Algorithmus. Wie besprochen, einige der Antworten, es funktioniert durch die
1) erstellen Sie eine Tabelle der aufsummierten Frequenzen
2) erzeugt eine zufällige ganze Zahl
3) Runden es mit ceiling-Funktion
4) findet die "summiert" Bereich, in dem die Zufallszahl fällt und Ausgänge ursprüngliche array Entität auf der Grundlage der es
Inverse Transformation
In der Wahrscheinlichkeit sprechen, eine kumulative Verteilungsfunktion F(x) gibt die Wahrscheinlichkeit, dass eine zufällig gezogene Wert, nennen Sie es X <= einen bestimmten x-Wert. Zum Beispiel, wenn ich F(4) in diesem Fall würde ich bekommen .6. da die laufende Summe der Wahrscheinlichkeiten in deinem Beispiel ist
{.2, .4, .5, .55, .6, .65, ....}
. I. e. die Wahrscheinlichkeit, dass zufällig ein Wert kleiner als oder gleich 4 ist .6. Was ich aber eigentlich wissen will ist die inverse der kumulativen Wahrscheinlichkeit Funktion, nennen es F_inv. Ich will wissen, was ist der x-Wert gegeben ist die kumulative Wahrscheinlichkeit. Möchte ich weitergeben in F_inv(.6) und zurück 4. Das ist, warum dies nennt man die inverse-transform Methode.So, in der inverse-transform Methode, wir sind im Grunde versucht, zu finden, das Intervall in der Häufigkeitsverteilung in dem eine zufällige Uniform (0,1) Zahl fällt. Dies funktioniert aus dem Algorithmus, dass perreal und kältepack gepostet. Hier ist ein weiterer Weg, um es in Bezug auf die kumulative Verteilungsfunktion
Hinweis, dass es vielleicht effizienter sein, die Schleife geht von B nach A und überprüfen Sie, ob U >= F(x), wenn die kleinere Wahrscheinlichkeiten kommen am Anfang der Verteilung