Biased Random Number Generator
Ich bin auf der Suche nach einem Zufallszahlengenerator, der kann parteiisch sein. Zum Beispiel, sagen, ich will eine Zufallszahl zwischen 1-5, wobei die Wahrscheinlichkeit als:
1: Kommt bis 20% der Zeit
2: Kommt bis zu 10% der Zeit
3: Kommt bis 40% der Zeit
4: Kommt in 25% der Zeit
5: Kommt auf bis zu 5% der Zeit
Gibt es etwas in der standard-Bibliothek oder andere Bibliotheken gibt, die dies tun? Alternativ, gibt es eine effiziente Möglichkeit, diese selbst zu tun?
- Ich hoffe, du bist nicht das schreiben von software für casinos!
- Haha Nein, ich bin mir sicher, dass ein casino mieten jemand ein wenig schlauer.
- Von gestern: stackoverflow.com/questions/2772882/... und das war ein Duplikat von Unmengen von früheren Versionen der gleichen Frage (die ich zu faul bin zu suchen). Das Wort, das Sie vielleicht fehlten bei der Suche ist "diskret", was wichtig ist, wie eine Reihe von Antworten besser zutreffen kontinuierliche Verteilungen.
- kopieren und einfügen von getestem code für c# ... stackoverflow.com/a/33991225/294884 ... funktioniert mit jedem array-trivial
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Boost random number library bietet die Möglichkeit zum festlegen von verschiedenen geformten Verteilungen für Ihren generator. Es ist eine große Bibliothek - siehe http://www.boost.org/doc/libs/1_42_0/libs/random/index.html.
Für Ihr problem, wählen Sie einfach ein element zufällig aus dieser Liste einheitlich:
Im Allgemeinen, überprüfen Sie diese Antwort: Gewichteten Zufallszahlen
In TR1 und C++0x gibt es
<random>
- header enthält diediscrete_distribution
Klasse zu generieren, diese zahlen, unter anderem.Können Sie auch prüfen wollen, GSL enthält viel mehr zufällige Verteilungen (und Zufallszahlen-Generatoren) als die standard -
<random>
Bibliothek. (Aber beachten Sie, dass die GSL verwendet GPLv3.)Beste Weg ist wohl, einfach die normale unvoreingenommene Zufallsgenerator dann wieder, basierend auf den Intervall-Ihr Wert fällt in.
Nur einer if-Anweisung, gibt 1 für 0:0.2, 2 für 0,2:0.3, 3 für 0,3:0.7, 4 0,7:0,95 und 5 für 0.95:1. Am besten stellen Sie entweder die untere oder Obere Grenze des Intervalls inklusive und exklusive.
Sowas.
Was Sie beschreiben, ist die Implementierung eines Zufallszahlengenerators, der zieht aus einer bestimmten Wahrscheinlichkeitsverteilung. Zum Beispiel, die zahlen von einer Gauß-Verteilung zeichnen soll zufällige zahlen, so dass die Wahrscheinlichkeit einer bestimmten Ziehung, x ist proportional zu
(Quelle: wikimedia.org)
.
Im Allgemeinen, der Ansatz ist zu zeichnen von einer gleichmäßigen zufälligen Verteilung und wählen Sie dann den Wert der gewünschten Verteilung ist, cumulative distribution function (CDF) auf, die gezeichnete Lage. Im Falle einer Normalen Gauß, ziehe eine Zufallszahl x von einer gleichmäßigen Verteilung (dies ist, was standard-Zufallszahlen-Generatoren geben sollte), und wählen Sie dann als die zufällige, Gauß-verteilten Wert. Für Ihren Fall, die CDF, die Sie beschreiben, ist eine stückweise kontinuierliche stair-step-Funktion, die umgesetzt werden könnten, mit einer der vielen (richtigen) Antworten, die Sie bereits erhalten haben.
Natürlich, das ist alles nur Bagatellen. Was Sie sollte tun, ist die Verwendung einer Bibliothek, die bereits erledigt dies für Sie. Statistik und Zufallszahlen-Erzeugung sind nicht trivial und es gibt keine Notwendigkeit, das Rad neu zu erfinden. Siehe Neil ' s Antwort (und check-out der Boost random number Bibliothek).
Kommen spät, um die Partei auf diese ein. Hier ist der C++0x-Antwort:
Was für mich-Ausgänge:
Warum gehst du nicht einfach mit einem regulären random number generator, die Zahl zwischen 0.0 und 1.0, und wickeln Sie es mit einer anderen Funktion, die eine Zahl zurückgibt, entsprechend Ihren Anforderungen?
wie
seed
als Bezeichner für eine zufällig generierte Zahl, es ist verwirrend...Werfen eine zufällige reelle Zahl x in [0,1],
if 0< x<0.2 return 1
,if 0.2<x <0.3 return 2
usw.Sehen hier für das Allgemeine problem.
Kenny gab eine entsprechende Antwort, zugeschnitten auf Ihre speziellen Frequenz-Verteilung.
Die Allgemeine Antwort, arbeitet mit einem CDF - Cumulative Distribution Function - für die Daten, und verwendet eine einheitliche Zufallszahl, wählen Sie einen Wert innerhalb der Verteilung.
Bin ich dabei, das gleiche zu tun, und ich fand diese:
http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/
Scheint gut genug für den Zweck.
Und hier ist ein plot der Folge: