2017-05-15 19 views
2

モンティー・ホールをコードで証明しているように見えましたが、悲しいことに問題の証拠ではありませんでした。私が切り替えるかどうかにかかわらず、私は10000回のシミュレーションに勝つ確率は33%です。コードをチェックして、何が間違っているのを見ることができますか?私はWeb開発者であり、Pythonのスキルはあまり良くなく、コードは幻想的ではないかもしれないことを覚えておいてください(例えば、変数がうまく働いたremovable_doorsリストを作成しました)。乾杯!モンティ・ホール・シミュレータが間違った結果を出した

import random 
av_doors = [1, 2, 3] 
door_v = [1, 2, 3] 
removable_doors = [1, 2, 3] 
score = 0 
loses = 0 

door = int(input("Choose your door (1-3)")) 
pick = int(door)-1 

dec = input("Stay or switch? (0/1)") 

n = 0 
while n < 10000: 
    removable_doors = [1, 2, 3] 
    av_doors = [1, 2, 3] 
    val = random.randint(1,3) 
    if val == 1: 
     door_v[0] = 1 
     door_v[1] = 0 
     door_v[2] = 0 
     removable_doors.remove(1) 
    elif val == 2: 
     door_v[0] = 0 
     door_v[1] = 1 
     door_v[2] = 0 
     removable_doors.remove(2) 
    elif val == 3: 
     door_v[0] = 0 
     door_v[1] = 0 
     door_v[2] = 1 
     removable_doors.remove(3) 

    try: 
     removable_doors.remove(int(door)) 
    except: 
     pass 

    av_doors.remove(door) 

    if len(removable_doors) == 2: 
     rand_door = random.randint(0,1) 
     if rand_door == 0: 
      del av_doors[0] 
     elif rand_door ==1: 
      del av_doors[1] 
    else: 
     del av_doors[0] 

    if dec == "1": 
     door = av_doors[0] 
    else: 
     pass 

    pick = door-1 
    if door_v[pick] == 1: 
     score+=1 
    else: 
     loses+=1 

    n+=1 

print(score) 
print(loses) 
+0

あなたは '試す/ except'を持っていないのはなぜ?なぜドアは 'removable_doors'にないのですか? –

+0

「av_doors」とは何を表していますか? – user2357112

+0

あなたは実際にどこでも 'removable_doors'の内容を使用していません。 – user2357112

答えて

2

あなたのホストが時々機能するソリューションであり、(私が思う)少し良く書かれて、あなたの構造を維持しながら(のpython3ではなく、それは上げるべきではありません。ここ...その背後にある車で、ドアを削除しますトラブル):

import random 

win = 0 
lose = 0 

switch = int(input("Stay or switch? (0-stay/1-switch):")) == 1 

n = 0 
while n < 10000: 
    # Init 
    door_values = [0, 0, 0] 
    removable_doors = [0, 1, 2] 
    available_doors = [0, 1, 2] 

    # Placing the reward somewhere 
    car_place = random.randint(0, 2) 
    door_values[car_place] = 1 
    removable_doors.remove(car_place) 

    # Choose a door 
    door_chosen = random.randint(0, 2) 
    available_doors.remove(door_chosen) 
    if door_chosen != car_place: 
     removable_doors.remove(door_chosen) 

    # Host removes a door that does not have the car and has not been chosen by the player 

    door_removed_by_host = removable_doors[random.randint(0, len(removable_doors)-1)] 
    available_doors.remove(door_removed_by_host) 

    # Switch if specified 
    if switch: 
     assert(len(available_doors) == 1) 
     door_chosen = available_doors[0] 

    # Check the result 
    if car_place == door_chosen: 
     win += 1 
    else: 
     lose += 1 

    n+=1 

print('win=%s'%str(win)) 
print('lose=%s'%str(lose)) 
print('ratio=%s'%str(win/(win+lose))) 

ときswitch=Falseそれは私に0.3332を与え、switch=Trueため0.6738は、私はこれはかなりモンティ・ホールのソリューションを確認推測:)

+0

@Adam Karolczakはあなたの質問に答えますか?もしそうなら、そのようにマークしてください。 – gdelab

関連する問題