Simple Berechnung von wahrscheinlichkeitsbedingten Werten

dcobra

Lt. Junior Grade
Registriert
Aug. 2011
Beiträge
286
Hallo!

Ich habe ein total simples Problem (logisch, nicht technisch) und komme gerade nicht auf die Lösung. Das mag daran liegen, dass ich heute schon viel zu lange vor einem Projekt sitze und bei den simpelsten Dingen den Wald vor lauter Bäumen nicht mehr sehe.

Ich habe drei Kategorien, nennen wir sie A, B und C.
Dann habe ich eine Methode, nennen wir sie "Kategorieauslosung". Diese soll mir bei einem Aufruf entweder A, B oder C zurückgeben.

Welche der drei Kategorien ausgelost wird, soll von Wahrscheinlichkeiten abhängen. Deshalb hat die Methode 3 Übergabeparameter namens AnteilA, AnteilB, AnteilC.

Beispielwerte für die Parameter: AnteilA = 5; AnteilB = 2; AnteilC = 7;

Dies würde bedeuten, dass mit die Auslosungs-Methode in 35,7% aller Fälle A, in 14,3% aller Fälle B und in 50% aller Fälle C zurückgeben sollte (im Mittel natürlich). Zur Verfügung steht in der Methode ein Zufallsgenerator, welcher gleichverteilte Werte im Intervall [0,1) zurückliefert.

In meienr Müdigkeit kam gerade folgendes heraus (pseudocode):

Code:
Kategorie Kategorieauslosung(AnteilA, AnteilB, AnteilC)
        {

            total = AnteilA + AnteilB + AnteilC;
            AnteilAProzent = (1 / total) * AnteilA;
            AnteilBProzent = AnteilAProzent + (1 / total) * AnteilB;

            zufall = random.next();

            if zufall <= AnteilAProzent
            {
                return A;
            }
            else if zufall <= AnteilBProzent
            {
                return B;
            }
            else
            {
                return C;
            }
        }

Das funktioniert, aber natürlich nur, solange AnteilA < AnteilB < AnteilC.

Wie geht es besser?

Danke.
 
meiner meinung nach müsste es in zeile 14 zufall <= AnteilAProzent + AnteilBProzent sein. So wie es jetzt ist, wäre die Wahrscheinlichkeit für b viel kleiner.

Edit: Ach ne das machst du ja in Zeile 6. Aber dann sehe ich nicht warum das nur unter der Bedingung funktionieren sollte.

EDIT2: Du kannst bei den Berechnungen noch die 1 rauskürzen und hättest dann AnteilX/total. Und die Berechnung bräuchtest du nur im B-Fall machen. Ist aber beides eher kosmetisch.
 
Zuletzt bearbeitet:
Probier es doch mal mit einer Fall Unterscheidung in der du dann Mit If-Else testest ob größer kleiner.
 
Hallo,

also entweder habe ich den selben Schlauch gefunden wie Du und stehe da jetzt auch drauf oder es ist doch so OK?

Die verschiedenen größen der Anteile berücksichtigst Du ja schon in der Aufaddition der Prozentanteile der einzelnen Wahrscheinlichkeiten zu den Wert der in der Abfrage vorher Geltung findet.

Selbst wenn A=99 ist und B=1 wird ja der für A geltende Bereich von 0 bis 0.99 gehen und B nur .99 bis 1 also auch nur wirklich 1% Treffer erfahren.

Also für mich ist der Code OK, wüsste nicht wo da ein Problem mit "funktioniert nur für AnteilA < AnteilB < AnteilC" auftauchen sollte.

hf
E.o.B
 
In den if-Bedingungen darfst du nicht auf <= prüfen, sondern nur auf <, sonst stimmen die Wahrscheinlichkeiten nicht. (weil random() ja Zahlen im Bereich von [0,1) liefert)
Der Rest passt so.

So klappts bei mir:
Code:
	static int getCategory(int rateA, int rateB, int rateC)
	{
		int total = rateA + rateB + rateC;
		int random = (int) (Math.random() * total);

		if (random < rateA)
		{
			return 0;
		}
		else if (random < rateA + rateB)
		{
			return 1;
		}
		else
		{
			return 2;
		}
	}
 
Zuletzt bearbeitet:
Autsch, da war ich gestern so müde, dass ich nicht mal erkannt habe, dass mein Code eigentlich stimmt. Vielen Dank an alle :)
 
Zurück
Oben