Auswahl eines Zufallswertes basierend auf Wahrscheinlichkeiten

7

Es gibt eine ähnliche Frage , ich weiß, aber es verwirrte mich, deshalb dachte ich, es wäre leichter, auf meine Art zu fragen.

Ich habe also eine Reihe von positiven und negativen Werten. Je höher sie sind, desto wahrscheinlicher ist ihre Wahl Ich habe Schwierigkeiten, herauszufinden, wie ich die Wahrscheinlichkeiten zuordnen soll, und dann zufällig eine auszuwählen. Ich vermute, dass das Array zuerst sortiert werden muss, aber dann bin ich ein bisschen verloren.

    
FizzBuzz 05.05.2010, 11:51
quelle

3 Antworten

22

"Ich habe verschiedene Größen von Tassen Kaffee. Je größer sie sind, desto mehr möchte ich für sie berechnen. Ich habe Schwierigkeiten, herauszufinden, wie man die Preise richtig verteilt."

Dies ist nicht nur ein Programmierproblem - Sie haben angegeben, dass die Wahrscheinlichkeit mit dem Wert zunimmt, aber Sie haben nicht gesagt, wie sie mit dem Wert zunimmt. Normalerweise berechnen Coffeeshops nicht direkt proportional zur Kaffeemenge. Sie können keine Wahrscheinlichkeiten proportional zum Wert zuweisen, da einige Ihrer Werte negativ sind, aber die Wahrscheinlichkeiten nicht negativ sein können.

Klingt so, als müssten Sie das Problem noch ein wenig auflösen, bevor Sie irgendeinen Code schreiben können.

Wenn es Ihnen wirklich egal ist, wie sich die Wahrscheinlichkeit auf den Wert bezieht, außer dass sie sich in der Reihenfolge des Wertes erhöhen, dann wäre ein einfacher Weg:

  • Sortiere dein Array
  • Weisen Sie dem ersten Element eine Wahrscheinlichkeit von 1 zu, 2 dem zweiten und so weiter.
  • Nun addieren sich Ihre Wahrscheinlichkeiten nicht zu 1, was ein Problem ist. Teilen Sie daher jede Wahrscheinlichkeit durch die Summe aller Wahrscheinlichkeiten, die Sie zugewiesen haben: (1 + 2 + .. + n) = n(n+1)/2 . Dies wird "Normalisierung" genannt.

Angesichts Ihrer Liste von Wahrscheinlichkeiten, die sich zu 1 addieren, besteht die einfachste Möglichkeit, wiederholt eine zu wählen, in der Berechnung der kumulativen Wahrscheinlichkeiten , die ich anhand eines Beispiels demonstrieren werde:

%Vor%

Die kumulative Wahrscheinlichkeit ist definiert als die Summe aller Wahrscheinlichkeiten bis zu diesem Punkt.

Nun benötigen Sie von Ihrem Zufallszahlengenerator einen zufälligen (Gleitkomma-) Wert zwischen 0 und 1. Wenn er zwischen 0 und 0,1 liegt, haben Sie -12 gewählt. Wenn es zwischen 0,1 und 0,3 liegt, haben Sie -3 ausgewählt und so weiter. Um herauszufinden, in welchem ​​Bereich es liegt, können Sie linear durch Ihr Array gehen, oder Sie können eine binäre Suche durchführen.

Sie könnten den Normalisierungsschritt und die Verwendung von Fließkommazahlen überspringen, wenn Sie möchten. Weisen Sie "kumulative Wahrscheinlichkeiten" zu (1, 3, 6, 10 ...), aber stellen Sie sicher, dass die tatsächliche Wahrscheinlichkeit der gespeicherte ganzzahlige Wert dividiert durch n (n + 1) / 2 ist. Wählen Sie dann eine zufällige Ganzzahl von 0 bis n (n + 1) / 2 - 1. Wenn es kleiner als 1 ist, haben Sie den ersten Wert ausgewählt, sonst weniger als 3 Sekunden und so weiter. Dies kann den Code klarer machen oder auch nicht, und Ihr Zufallsgenerator kann oder sollte nicht gut darin sein, ganzzahlige Werte aus einem großen Bereich auszuwählen.

Beachten Sie, dass Sie Wahrscheinlichkeiten (0,001, 0,002, 0,003, 0,994) anstelle von (0,1, 0,2, 0,3, 0,4) hätten zuweisen können, und immer noch Ihre Anforderung erfüllt: "je höher der Wert, desto höher die Wahrscheinlichkeit" / p>     

Steve Jessop 05.05.2010, 11:58
quelle
2

Ein Weg könnte

sein
  • Machen Sie alle Werte positiv (addieren Sie den absoluten Wert des minimalen Wertes zu allen Werten)
  • Normalisieren Sie die Werte auf 1 (teilen Sie jeden Wert mit der Summe der Werte)

Um jetzt einen Wert aus der generierten Verteilung zu randomisieren, können Sie

verwenden
  • Wählen Sie eine Zufallszahl auf [0,1].
  • Beginnen Sie mit dem Summieren der Wahrscheinlichkeiten, bis die Summe größer oder gleich dem Zufallswert ist. Wählen Sie diesen Index als Ihren zufälligen Wert.
cjg 05.05.2010 12:11
quelle
1

Nach Steve Jessops Vorschlag können Sie, nachdem Sie eine zufällige ganze Zahl von 0 bis n (n + 1) / 2 - 1 gewählt haben, einfach die dreieckige Wurzel bekommen: (-1 + sqrt ((8 * x)) ) +1)) / 2

    
anon 02.11.2011 06:53
quelle

Tags und Links