Verteilte Wahrscheinlichkeit random number generator
Möchte ich zum generieren einer Anzahl basierend auf einem verteilten Wahrscheinlichkeit. Zum Beispiel, sagen Sie einfach: es sind die folgenden vorkommen der einzelnen zahlen:
Number| Count
1 | 150
2 | 40
3 | 15
4 | 3
with a total of (150+40+15+3) = 208
then the probability of a 1 is 150/208= 0.72
and the probability of a 2 is 40/208 = 0.192
Wie mache ich ein random number generator, die zurückgegeben werden, zahlen basierend auf dieser Wahrscheinlichkeitsverteilung?
Ich bin glücklich für diese werden auf Basis eines statischen, fest programmierte Satz für jetzt, aber ich will schließlich es zur Ableitung der Wahrscheinlichkeitsverteilung aus einer Datenbank-Abfrage.
Ich habe gesehen, ähnliche Beispiele, wie diese eine aber Sie sind nicht sehr allgemein. Irgendwelche Vorschläge?
InformationsquelleAutor der Frage Mark Conway | 2012-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Allgemeinen Ansatz ist das Futter gleichmäßig verteilte Zufallszahlen aus 0..1 Intervall in die inverse der kumulativen Verteilungsfunktion der gewünschten Verteilung.
So, in Ihrem Fall, ziehen Sie einfach eine zufällige Anzahl x von 0..1 (zum Beispiel mit
Random.NextDouble()
) und basierend auf den Wert zurückInformationsquelleAutor der Antwort Adam Zalcman
Diese Frage erläutert die verschiedenen Ansätze für die Generierung von Zufallszahlen mit verschiedenen Wahrscheinlichkeiten. Nach dieser Artikelgezeigt, auf, die Frage, die am besten so Vorgehen (in Bezug auf die Zeit-Komplexität) ist die so genannte "alias-Methode" von Michael Vose.
Für Ihre Bequemlichkeit, habe ich geschrieben und bieten hier eine C# - Implementierung eines Zufallszahlengenerators Umsetzung der alias Methode:
Beispiel:
Stelle ich diesen code in der public domain.
InformationsquelleAutor der Antwort Peter O.
Dies nur einmal tun:
Tun Sie dies jedes mal:
Ist die Laufzeit proportional zu log von der Größe des gegebenen pdf-array. Das ist gut so. Allerdings, wenn Ihr array-Größe wird immer so klein sein (4 in deinem Beispiel), dann durchführen einer lineare Suche ist einfacher und auch besser.
InformationsquelleAutor der Antwort Ali Ferhat
Ich weiß, dies ist eine alte post, aber ich habe auch gesucht wie ein generator und war nicht zufrieden mit den Lösungen, die ich gefunden. Also schrieb ich mein eigenes wollen und teilen Sie es der Welt.
Rufen Sie einfach "Hinzufügen(...)" einige Male, bevor Sie anrufen "NextItem(...)"
InformationsquelleAutor der Antwort Kithoras Carzyl
Danke für all Eure Lösungen Jungs! Sehr geschätzt!
@Menjaraz ich habe versucht, die Implementierung Ihrer Lösung, es sieht sehr Ressourcen-freundlich, jedoch hatten einige Probleme mit der syntax.
Also für jetzt, ich habe gerade verwandelt meine Zusammenfassung in einer Liste von Werten mithilfe von LINQ SelectMany() und Enumerable.Wiederholen().
InformationsquelleAutor der Antwort Mark Conway
Verwendung meiner Methode. Es ist einfach und leicht zu verstehen.
Ich zähle nicht Teil im Bereich 0...1, ich habe gerade mit "Probabilityp Pool" (klingt cool, ja?)
Bei Kreis-Diagramm können Sie sehen, das Gewicht jedes Elements in pool
Hier sehen Sie eine Umsetzung der kumulierte Wahrscheinlichkeit für roulette
InformationsquelleAutor der Antwort Alexandr Martysh
Hier ist eine Umsetzung mit den Inverse distribution function:
Ein Beispiel, um zu überprüfen, die zufällige Verteilung:
Beispiel-Ausgabe:
InformationsquelleAutor der Antwort Ray Vega