2016-08-06 3 views
0

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?

+0

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. –

Antwort

1

Sie spielen das Spiel nicht richtig. Nachdem der Wettkämpfer eine Tür gewählt hat, enthüllt der Wirt eine Ziege hinter einer der beiden anderen Türen und bietet dann dem Wettkämpfer die Möglichkeit zu wechseln - Sie haben die Wahl zwischen drei Türen statt zwei. Hier ist eine überarbeitete play() Funktion:

def play(strategy): 
    player = Player() 
    items = [Goat(), Goat(), Car()] 
    doors = [Door(name='a'), Door(name='b'), Door(name='c')] 

    random.shuffle(items) 

    for door in doors: 
     item = items.pop() 
     door.behind = item 

    player.choose(random.choice(doors)) 

    # player has chosen a door, now show a goat behind one of the other two 

    show = None 
    for door in doors: 
     if not (door.is_open or door.is_chosen) and door.behind.is_a == 'goat': 
      show = door 
      show.open() 
      break 

    # The player has now been shown a goat behind one of the two doors not chosen 

    if strategy == 'random': 
     if random.choice([True, False]): 
      for door in doors: 
       if not (door.is_open or door.is_chosen): 
        final = door 
        break 
     else: 
      final = player.door 

    elif strategy == 'switch': 
     for door in doors: 
      if not (door.is_open or door.is_chosen): 
       final = door 
       break 

    elif strategy == 'stay': 
     final = player.door 

    player.choose(final) 

    return player.open() 

Das führt zu Ergebnissen wie:

results: strategy=random wins=4977 loses=5023 
results: strategy=switch wins=6592 loses=3408 
results: strategy=stay wins=3368 loses=6632 
+0

D'oh! Ich weiß nicht, wie ich das nicht gesehen habe! Ich fange langsam an, dieses OOP-Ding runter zu bekommen ... – user1777667

Verwandte Themen