# Auswahl anhand Wahrscheinlichkeiten



## Gast (12. Jan 2007)

Ist wohl eher ein Matheproblem aber ich steh irgendwie auf dem Schlauch. 
Ich habe 3 Aktionen, die mit verschiedenen Wahrscheinlichkeiten ausgeführt werden. Wahrscheinlichkeiten sind bekannt. Also z.B.:

Aktion1 wird mit 20% Wahrscheinlichkeit ausgeführt
Aktion2 wird mit 30% Wahrscheinlichkeit ausgeführt
Aktion3 wird mit 50% Wahrscheinlichkeit ausgeführt

Wie krieg ich das hin, dass die Aktionen entsprechend ihrer Wahrscheinlichkeiten unterschiedlich häufig ausgewählt werden?


Also...


```
public int chooseAction(){
int nummer;
.
.
.
return nummer;
}
```

...soll Nummer der gewählten Aktion ausgeben und es soll in 20% der Fälle Aktion1, in 30% der Fälle Aktion2 und in 50% der Fälle Aktion3 rauskommen.
Danke im Vorraus!


----------



## SlaterB (12. Jan 2007)

genau diese Zahlen und wenn ja, dann in welcher Reihenfolge, was als erstes, zweites, drittes?
offensichtlich kann nur alle 10 Durchläufe das Ergebnis so genau erreicht werden


-------

oder Zufall:
nimm ein Objekt der Klasse Random (eins wiederverwenden, nicht ständig neu erzeugen!),
hole dir eine Zufallszahl, z.B. zwischen 0 und 1
und prüfe ob sie <0.2, <0.5 oder >= 0.5 ist


----------



## Guest (12. Feb 2007)

Nein, das sind immer andere Zahlen, habe jetzt nur für dieses Beispiel so einfache genommen, damit es verständlicher wird. 

Aber ich hab überlegt: 
Kann ich einfach 3 Zufallszahlen zwischen 0 und 1 generieren, die mit den %-Zahlen multiplizieren und dann dann das Maximum nehmen? Dann müsste doch das gewünschte rauskommen, oder?

also

max von
1) rand1*20%
2) rand2*30%
3) rand3*50%

dann müsste in 50% der Fälle das 3. das Maximum sein. Oder lieg ich total falsch?


----------



## moormaster (12. Feb 2007)

Anonymous hat gesagt.:
			
		

> max von
> 1) rand1*20%
> 2) rand2*30%
> 3) rand3*50%
> ...



[edit:] Wenn rand1-3 jeweils zwischen 1 und 0 liegen, dann ist nicht in 50% aller Fälle rand3 das Maximum, sondern im Mittel ist rand3 das Maximum. Über die konkreten Einzelfälle kann man in der Stochastik wenig aussagen.[/edit]

Also normaler Weise geht man von einer Gleichverteilung aus. D.h. wenn Zahlen zwischen 0 und 1 auftreten können, dann gibt es keine Zahl die im Schnitt bevorzugt (d.h. besonders häufig) auftritt. Nun könnte man diesen Bereich zwischen 0 und 1 aufteilen in Stücke, welche genau die gewünschten Größen haben.

Zum Beispiel wenn man eben 3 Elemente hat, die auftreten können, dann teilt man diesen Bereich zwischen 0 und 1 auch in 3 Stücke, wobei die Größe der Stücken eben den Häufigkeitsverhältnissen entsprechen, die man im Mittel erreichen möchte.

Zum Beispiel, wenn man den Bereich eben in 20%, 40% und ein 60% Stück aufteilen will, dann kann man das entsprechend durch folgende Festlegungen tun:

Element 1, wenn Zahl < 20
Element 2, wenn Zahl >= 20 und < 40
Element 3, wenn Zahl >= 40 (und < 100)

Dann würden die Elemente jeweils mit 20%, 40% und 60%iger Wahrscheinlichkeit eintreten. Das gilt aber nur, wenn es sich um echten Zufall handelt. Dieser wird jedoch bei den errechneten Pseudozufalls zahlen nie 100%ig erreicht (nur annähernd). Das heisst genau genommen gelten die Gesetze des Zufalls am Rechner nur annähernd. Es kann immer Zahlen geben, bei denen die Wahrscheinlichkeit vom "echten" Zufall abweicht.


----------



## SlaterB (12. Feb 2007)

> max von 
> 1) rand1*20% 
> 2) rand2*30% 
> 3) rand3*50% 

> dann müsste in 50% der Fälle das 3. das Maximum sein. Oder lieg ich total falsch?

ich kann mir jetzt gut vorstellen, dass das mathematisch anders aussieht,
aber mache doch mal eben einen Test mit 1 Mio. oder noch mehr Durchläufen + mitzählen
dann dürfte das Ergebnis deutlich sein,

die <=-Methode ist weniger aufwendig


----------



## FelixB (13. Feb 2007)

```
double p1 = 0.2;
double p2 = 0.3;
double p3 = 0.5; // brauchst eigentlich nicht

double rand = getRandom(); 

if(rand <= p1) action1;
if(rand <= p2) action 2;
if(rand > p2) action 3;
```

nur mal so schnell runtergetippt, die Zufallszahl musst natürlich richtig holen (zwischen 0 und 1). Die Wahrscheinlichkeiten setzt du halt irgendwie vorher in die Variablen p1 und p2 (p3 ist eigentlich nciht nötig, ergibt sich auch aus p3 = 1-p1-p2).


----------

