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
Wahrscheinlichkeit
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.
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.
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})
Zuletzt geändert von EyDu am Montag 12. März 2012, 15:00, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
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).
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 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 haben Wahrscheinlichkeitsverteilungen per Definition so an sich. Sonst würde es sich in diesem Fall nicht um Wahrscheinlichkeiten handeln./me hat geschrieben:Das funktioniert dann, wenn die Wahrscheinlichkeiten auf 1 ergänzen.
Das Leben ist wie ein Tennisball.
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?