Laden...

Aktion nach bestimmter Wahrscheinlichkeit ausführen

Erstellt von Lollek vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.928 Views
L
Lollek Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren
Aktion nach bestimmter Wahrscheinlichkeit ausführen

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.

C
1.214 Beiträge seit 2006
vor 12 Jahren

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.

L
Lollek Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

Danke für deine schnelle Antwort 😃 bin doch dumm... oO

49.485 Beiträge seit 2005
vor 12 Jahren

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

C
1.214 Beiträge seit 2006
vor 12 Jahren

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...

L
416 Beiträge seit 2008
vor 12 Jahren

@Coder007 Lies nochmal genau 😉

Dann schaut man der Reihe nach:

C
1.214 Beiträge seit 2006
vor 12 Jahren

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...

L
Lollek Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

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:

  1. Nimm dir die kleinste Wahrscheinlichkeit p0 (z.B. 0.1)
  2. Erstelle 1/p0 Zufallszahlen (im Beispiel: 10)
  3. Weise jeder Aktion p * 1/p0 Zahlen zu
    (Aus gehend vom Ursprungsbeispiel:
    a0 -> { 0 },
    a1 -> { 1 },
    a2 -> { 2 },
    a3 -> { 3, 4 },
    a4 -> { 5, 6 },
    a5 -> { 7, 8, 9 }
    )

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

F
155 Beiträge seit 2009
vor 12 Jahren

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."

L
Lollek Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

jo stimmt. wie ich bereits sagte: bin doch dumm... oO

L
Lollek Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

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!