Hallo Leute,
ich habn komisches Problem und bekomme es einfach nicht gebacken....
Es gibt eine bestimmte Anzahl von Wahrscheinlichkeiten.
Diese können ganz unterschiedlich aussehen oder auch gleich sein. In der summe ergeben sie 1 (sprich: eines der Ereignisse muss stattfinden).
Beispiel:
p0 = 0.1
p1 = 0.1
p2 = 0.1
p3 = 0.2
p4 = 0.2
p5 = 0.3
(-> Summe = 1)
Zu den oben stehenden 6 Wahrscheinlichkeiten gibt es 6 Aktionen (z.B. a0..a5) von denen eine mit der ihr zugeordneten Wahrscheinlichkeit ausgeführt wird.
Wie kann ich dieses Problem nun mittels Code realisieren?? Meine bisherigen Ideen basieren alle auf einem Ansatz mit Random.NextDouble() aber bis jetzt hat noch nichts funktioniert.
P.S.: Sorry, ich weiss, das Problem hat prinzipiell nichts mit der verwendeten Programmiersprache zu tun.
Naja, du brauchst halt einen zufälligen Wert aus einem Bereich, der deiner Wahrscheinlichkeit entspricht. z.B., du willst eine Aktion mit der Wahrscheinlichkeit 0.2 ausführen lassen. Dann brauchst du einen Bereich mit 5 Werten. Oder allgemein, 1/Wahrscheinlichkeit. Den Bereich übergibst du der Random Klasse und dann vergleichst du das Ergebnis auf einen bestimmten Wert.
Hallo Coder007,
mir ist nicht klar, ob du genau das gemeint hast, was ich jetzt schreibe. Aus meiner Sicht reicht es, eine Zufallszahl zwischen 0 und 1 zu erzeugen. Dann schaut man der Reihe nach: wenn die kleiner als 0.1 ist, erste Aktion; wenn sie kleiner ist als 0.1+0.1, zweite Aktion; wenn sie kleiner ist als 0.1+0.1+0.1, dritte Aktion; wenn sie kleiner ist als 0.1+0.1+0.1+0.2, vierte Aktion usw. Man sollte natürlich versuchen, das als Schleife über die Einzelwahrscheinlichkeiten zu realisieren.
herbivore
Hallo herbivoir,
ich verstehe das Problem anders. Die Wahrscheinlichkeiten sind ja unabhängig voneinenader oder von einer Reihenfolge. Es geht einfach darum, dass die Wahrscheinlichkeit, dass das Ereignis a3 auftritt, 0.1 ist. So wie ich deinen Vorschlag verstanden habe, würdest du sie ausführen, wenn sie kleiner als 0.1+0.1+0.1 ist, also mit 30% Wahrscheinlichkeit. Aber die Wahrscheinlichkeit ist ja mit 0.1 angegeben...
@Coder007 Lies nochmal genau 😉
Dann schaut man der Reihe nach:
Sorry, hast Recht. Das könnte hinkommen. Garantiert im Gegensatz zu meinem Vorschlag auch, dass genau eine Aktion ausgeführt wird. Da müsste man die Aufgabenstellung genauer definieren, ich hab sie zuerst anders verstanden, könnte man aber auch so sehen...
nee nee, der coder hat recht. 0.1+0.1+0.1 = 0.3. d.h. sie wird mit einer Wahrscheinlichkeit von 30 % ausgeführt, was ja nicht erwünscht ist (Auch wenns der Reihe nach geht).
Hab das Problem nach folgendem Algorithmus gelöst:
Wenn nun eine Aktion die generiert Zufallszahl enthält, wird sie ausgeführt.
Wenn jmd einen anderen Weg kennt, lasst es mich wissen.
Grüße
Hallo,
bei herbivores Vorschlag hat die Aktion a2 nicht eine Wahrscheinlichkeit von 30%, sondern wie gewünscht von 10%. Sie wird nur ausgeführt wenn die Zufallszahl größer 0.2 ist, sonst wird a1 ausgeführt und wenn sie kleiner als 0.3 ist, sonst wird a3 ausgeführt.
Der Vorschlag von herbivore hat gegenüber deiner Methode den Vorteil das sie auch funktioniert, wenn die einzelnen Wahrscheinlichkeiten nicht durch die kleinste Wahrscheinlichkeit teilbar sind z.B. p0=0.45 und p1=0.55.
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Für die die es Interessiert, hier mein Code:
double rnd = m_Random.NextDouble();
int ndxToConnectTo = 0;
double sumProbability = 0;
for (int i = 0; i < m_Network.Length; i++)
{
sumProbability += m_Network[i].Probability;
if (rnd < sumProbability)
{
ndxToConnectTo = i;
break;
}
}
[...]
Das Problem stammt aus dem Algorithmus des Preferential Attachment. Damit kann man u.a. das Wachstum von diversen Netzwerken modellieren.
Wiedermal ist die Lösung um einiges trivialer als ich dachte 😁
Grüße
Ach ja, und danke an alle!