Ausprobieren einiger OOP in Python, versuchte ich, eine Monty Hall Problem-Simulation zu erstellen, die ungerade Ergebnisse gibt. Ich implementiere drei verschiedene Strategien, aus denen ein Spieler auswählen kann, entweder um bei der ersten ausgewählten Tür zu bleiben, um zur zweiten geschlossenen Tür zu wechseln, oder um zufällig zwischen ihnen zu wählen.Python OOP Monty Hall nicht die erwarteten Ergebnisse
import random
class Door():
behind = None
is_open = False
is_chosen = False
def __init__(self,name=None):
self.name = name
def open(self):
self.is_open = True
def choose(self):
self.is_chosen = True
class Goat():
is_a = 'goat'
class Car():
is_a = 'car'
class Player():
door = None
def choose(self,door):
self.door = door
self.door.choose()
def open(self):
self.door.open()
if self.door.behind.is_a == 'car':
return True
return False
def play(strategy):
player = Player()
items = [Goat(),Goat(),Car()]
doors = [Door(name='a'),Door(name='b'),Door(name='c')]
for door in doors:
item = items.pop()
door.behind = item
random.shuffle(doors)
player.choose(random.choice(doors))
if strategy == 'random':
if random.choice([True,False]):
for door in doors:
if not door.is_open and not door.is_chosen:
final = door
break
else:
final = player.door
elif strategy == 'switch':
for door in doors:
if not door.is_open and not door.is_chosen:
final = door
break
elif strategy == 'stay':
final = player.door
player.choose(final)
if player.open():
return True
else:
return False
## Play some games
for strategy in ['random','switch','stay']:
results = []
for game in range(0,10000):
if play(strategy):
results.append(True)
else:
results.append(False)
## Gather the results
wins = 0
loses = 0
for game in results:
if game:
wins += 1
else:
loses += 1
print 'results:\tstrategy={}\twins={}\tloses={}'.format(strategy,str(wins),str(loses))
Aber jedes Mal, wenn ich es laufen, bekomme ich so etwas wie:
results: strategy=random wins=3369 loses=6631
results: strategy=switch wins=3369 loses=6631
results: strategy=stay wins=3320 loses=6680
Warum ist das für jede Strategie fast die gleichen Ergebnisse zu geben? Sollte die "Switch" -Strategie nicht ein Verhältnis von ~ 66% zu Gewinnen und "Stay" von ~ 33% ergeben?
BTW, ist es nicht viel Unterschied für dieses Programm machen, aber es wird empfohlen, in Python 2, um Ihre Klassen erben von ' object ', zB' class Door (object) ', so dass Sie neue Stilklassen anstelle von altem Stil erhalten (alte Stilklassen existieren in Python 3 nicht). Warum sollten Sie sich auch besondere Ziegen- und Wagenklassen machen? Sie können auch einfach "Goat" und "Car" String-Objekte verwenden. Es wäre effizienter, da der Interpreter weiß, dass Strings unveränderlich sind, so dass es dasselbe String-Objekt "recyceln" kann, wenn es doppelte String-Literale erkennt. –