Wahrscheinlichkeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Montag 12. März 2012, 14:38

Hey,
schreibe gerade einen kleines Spiel, bei dem per Zufall (random.choice)ein Spieler aus einer Liste ausgewählt wird. Nun will ich umsetzen, dass die Wahrscheinlichkeit für die Auswahl von Spielern, die weniger oft an der Reihe waren, steigt. Leider hab ich nicht mal eine Idee wie ich das umsetzen könnte. Daher würde ich mich sehr über Hilfe freuen :)

Gruß Waki
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

Montag 12. März 2012, 14:48

Ich würds jetzt so machen: 100% - spieler.anzahl_spiele/spiel.gesamt_anzahl. Wenn bsp. der Spieler 30% der Spiele mitgemacht hat, so kommt er nächstes mal zu 70% an die reihe.
1 - 3 Runde: Alles zufällig
Dann würde ich jeden Spieler der Wahrscheinlichkeit nach so ordnen, dass die ,deren Wahrscheinlichkeit als nächstes dranzukommen, vorne in der Liste stehen und die anderen hinter ihnen. Alles geordnet. Dann würde ich die Liste einzeln durchgehen und als nächstes wieder mit den 3 Runden Zufall neu beginnen.
EyDu
User
Beiträge: 4877
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 12. März 2012, 14:58

Code: Alles auswählen

>>> import random
>>> import bisect
>>> import collections
>>> def select_player(ps):
...     acc = reduce(lambda x,y: x+[y+x[-1]], ps, [0.0])
...     return bisect.bisect_right(acc, random.random())-1
... 
>>> d = collections.defaultdict(int)
>>> ps = [0.1, 0.5, 0.2, 0.2]
>>> for i in range(1000):
...     d[select_player(ps)] += 1
... 
>>> d
defaultdict(<type 'int'>, {0: 84, 1: 520, 2: 191, 3: 205})
Zu dem Thema sollte aber noch der eine oder andere Thread hier im Forum rumliegen.
Zuletzt geändert von EyDu am Montag 12. März 2012, 15:00, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

Montag 12. März 2012, 14:59

Das random Modul hat eine Methode ("sample" glaub ich), die die Einträge einer Liste in zufälliger Reihenfolge zurückgibt. Wenn du dir also einfach eine Liste erstellst, in der jeder Spielername mehrmals vertreten ist und diese dann in zufälliger Reihenfolge abarbeitest, steigt automatisch die Wahrscheinlichkeit der Auswahl von Spielern die bisher noch nicht so oft gewählt wurden (weil von denen ja mehr Einträge in der Restliste vorhanden sind).
Benutzeravatar
/me
User
Beiträge: 3434
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Montag 12. März 2012, 15:44

EyDu hat geschrieben:

Code: Alles auswählen

>>> def select_player(ps):
...     acc = reduce(lambda x,y: x+[y+x[-1]], ps, [0.0])
...     return bisect.bisect_right(acc, random.random())-1
Das funktioniert dann, wenn die Wahrscheinlichkeiten auf 1 ergänzen. Ist das nicht der Fall, dann muss man das Zufallsergebnis noch mit max(acc) multiplizieren.
EyDu
User
Beiträge: 4877
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 12. März 2012, 15:56

/me hat geschrieben:Das funktioniert dann, wenn die Wahrscheinlichkeiten auf 1 ergänzen.
Das haben Wahrscheinlichkeitsverteilungen per Definition so an sich. Sonst würde es sich in diesem Fall nicht um Wahrscheinlichkeiten handeln.
Das Leben ist wie ein Tennisball.
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Montag 12. März 2012, 16:44

Danke, das funktioniert schon sehr gut. Jedoch stehe ich immernoch vor dem Problem, dass sich die Wahrscheinlichkeit für einen Spieler erhöhen soll, falls es er öfters nicht an der Reihe war. Hättet ihr auch dafür eine Idee?
Antworten