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.
"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:
(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>
Ein Weg könnte
seinUm jetzt einen Wert aus der generierten Verteilung zu randomisieren, können Sie
verwendenTags und Links c random probability