Программа о проблеме Монти Холла, не дающей ожидаемых результатов - PullRequest
1 голос
/ 14 марта 2019

Прежде всего, эта программа, вероятно, глупая и неэффективная и длинная, но это моя первая настоящая программа, и если вы предлагаете изменения в программе, помните об этом. и текст на норвежском. Если что-то неясно, просто спросите, и я переведу больше.

Код написан на jupyter с использованием python 3 и представлен с использованием сюжета

Я прочитал эту ветку , так как она описывает мой вопрос, но я не понял его должным образом, ответ может быть там.

Вопрос 1: Почему это не возвращает правильное соотношение, должно быть 33% и 66%. В настоящее время это около 55% и 44%.

Вопрос 2: Если бы вы сделали это более упорядоченным, но все же очень простым, что бы вы сделали?

Вопрос 3: Является ли secretts.randbelow (3) "достаточно случайным", чтобы использовать его таким образом?

Вопрос 4: Любые предложения о том, как лучше представить данные?

Извините за грязный код и орфографические ошибки заранее. если код не читается, я с радостью переведу его больше.

import random     #importerer brukte pakker
import secrets
import plotly.plotly 
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot,      iplot
import numpy
init_notebook_mode(connected=True)


dør1 = 0;         # initialising the variables
dør2 = 0;
dør3 = 0;
bytte_tap = 0  #Keeps track of how many loses after changing
bytte_vinn = 0 #Keeps track of how many wins after changing
bli_tap = 0    #Keeps track of how many loses after not changing
bli_vinn = 0   #Keeps track of how many wins after not changing
i = 0

print_on = 0          # Sett 1 for å få debug koder
antall_runder = 1000000  #sets amount of runs


def scenario_1(): # defines the three positions the car can be in
    global dør1   # 1 = Car 0 = Goat
    global dør2
    global dør3
    dør1 = 1
    dør2 = 0
    dør3 = 0


def scenario_2(): 
    global dør1   
    global dør2
    global dør3
    dør1 = 0
    dør2 = 1
    dør3 = 0


def scenario_3(): 
    global dør1   
    global dør2
    global dør3
    dør1 = 0
    dør2 = 0
    dør3 = 1


while i < antall_runder:  # main loop

    i += 1 # counter

    scenario_valg = secrets.randbelow(3) +1  # Chooses one of the possible positions 



    if scenario_valg == 1:     # Runs the chosen scenario.
        scenario_1()
    elif scenario_valg == 2:   # Runs the chosen scenario.
        scenario_2()
    elif scenario_valg == 3:   # Runs the chosen scenario.
        scenario_3()
    else:
        print("error")

    første_valg = secrets.randbelow(3) +1 # Randomly chooses the first door.

    andre_valg = secrets.randbelow(2)   # Randomly chooses whether the player chooses a new door


    if scenario_valg == 1 and første_valg == 1 and andre_valg == 1: # Figures out if the player has a correct combination of choices for scenario 1.
        if print_on == 1: print("1, 1, ja, tap")                    
        bytte_tap += 1
    elif scenario_valg == 1 and første_valg == 1 and andre_valg == 0:
        if print_on == 1: print("1, 1, nei, vinn")
        bli_vinn += 1
    elif scenario_valg == 1 and første_valg == 2 and andre_valg == 1:
        if print_on == 1: print("1, 2, ja, tap")
        bytte_tap += 1
    elif scenario_valg == 1 and første_valg == 2 and andre_valg == 0:
        if print_on == 1: print("1, 2, nei, vinn")
        bli_vinn += 1
    elif scenario_valg == 1 and første_valg == 3 and andre_valg == 1:
        if print_on == 1: print("1, 3, ja, vinn")
        bytte_vinn += 1
    elif scenario_valg == 1 and første_valg == 3 and andre_valg == 0:
        if print_on == 1: print("1, 3, nei, tap")
        bli_tap += 1



    if scenario_valg == 2 and første_valg == 1 and andre_valg == 1: # Figures out if the player has a correct combination of choices for scenario 2.
        if print_on == 1: print("2, 1, ja, vinn")                  
        bytte_vinn += 1
    elif scenario_valg == 2 and første_valg == 1 and andre_valg == 0:
        if print_on == 1: print("2, 1, nei, tap")
        bli_tap += 1
    elif scenario_valg == 2 and første_valg == 2 and andre_valg == 1:
        if print_on == 1: print("2, 2, ja, tap")
        bytte_tap += 1
    elif scenario_valg == 2 and første_valg == 2 and andre_valg == 0:
        if print_on == 1: print("2, 2, nei, vinn")
        bli_vinn += 1
    elif scenario_valg == 2 and første_valg == 3 and andre_valg == 1:
        if print_on == 1: print("2, 3, ja, vinn")
        bytte_vinn += 1
    elif scenario_valg == 2 and første_valg == 3 and andre_valg == 0:
        if print_on == 1: print("1, 3, nei, tap")
        bli_tap += 1


    if scenario_valg == 3 and første_valg == 1 and andre_valg == 1:  # Figures out if the player has a correct combination of choices for scenario 3.
        if print_on == 1: print("3, 1, ja, vinn")                    
        bytte_vinn += 1
    elif scenario_valg == 3 and første_valg == 1 and andre_valg == 0:
        if print_on == 1: print("3, 1, nei, tap")
        bli_tap += 1
    elif scenario_valg == 3 and første_valg == 2 and andre_valg == 1:
        if print_on == 1: print("3, 2, ja, vinn")
        bytte_vinn += 1
    elif scenario_valg == 3 and første_valg == 2 and andre_valg == 0:
        if print_on == 1: print("3, 2, nei, tap")
        bli_tap += 1
    elif scenario_valg == 3 and første_valg == 3 and andre_valg == 1:
        if print_on == 1: print("3, 3, ja, tap")
        bytte_tap += 1
    elif scenario_valg == 3 and første_valg == 3 and andre_valg == 0:
        if print_on == 1: print("3, 3, nei, vinn")
        bli_vinn += 1

init_notebook_mode()              # Plotly stuff i don't understand

keys=['Vinn - tap med bytting', 'Vinn - tap uten bytting']  # More Plotly stuff i don't understand
values=[bytte_vinn - bytte_tap, bli_vinn - bli_tap]

iplot({
    "data": [go.Bar(x=keys, y=values)],
    "layout": go.Layout(title="Monty Hall problemet")  # More Plotly stuff i don't understand
})

prosent_uten_bytting = bli_vinn / antall_runder * 100 *2  # Calculates the % of wins if you don't change your choice.
prosent_med_bytting = bytte_vinn / antall_runder * 100 *2 # Calculates the % of wins if you change your choice.



if print_on == 1: print(bytte_vinn, bytte_tap, bli_vinn, bli_tap)  # Debug message
print("Med bytting vant du", prosent_med_bytting, "% av tiden")   # Prints the %
print("Uten bytting vant du", prosent_uten_bytting, "% av tiden")# Prints the %

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Более элегантный способ написать это было бы примерно так:

import numpy as np
cnt = 0
tries = 1000000
for _ in range(tries):
    doors = np.zeros(3)
    doors[np.random.randint(3)] = 1
    choice = np.random.randint(3)
    if doors[choice] == 1:  # If we chose this door on the first try we will change the door afterwards and not win
        cnt+=1

print("Lost:",cnt/tries)
print("Won:",(tries-cnt)/tries)

Вам просто нужна переменная счетчика, в которой вы либо подсчитываете раунды, в которых вы выиграли, либо те, в которых вы выиграли.потерял.Тогда у вас есть цикл, в котором у вас есть два случайных числа.Я использовал массив для представления дверей, но вы также можете просто использовать случайное число, за которым известно, за какой дверью победа.Затем вам нужно только один чек.Если выбранная вами дверь является дверью, за которой находится приз, вы потеряете ее, поскольку модератор откроет дверь и переключится на другую дверь (за ней ничего нет).Если вы не выбрали дверь с призом, вы выиграли, поскольку теперь вы переключаетесь на дверь с призом.Поэтому многие операторы if могут исчезнуть, если вам не нужны отпечатки.

Вопрос 3: секреты. Ниже приведен случайный случай.Это для такой вещи может быть даже немного излишним, так как вам не нужно иметь криптографически сильные случайные числа.Таким образом, вы также можете использовать библиотеку numpy random или «random» из python.

0 голосов
/ 14 марта 2019

Для вашего основного вопроса, 33% и 66% должны представлять случай, когда игрок случайным образом выбирает между сохранением текущей двери или переключением?Я думал, что это были без переключателя и переключателя соответственно.В любом случае эту часть вашего кода можно сделать намного приятнее:

if scenario_valg == 1 and første_valg == 1 and andre_valg == 1: # Figures out if the player has a correct combination of choices for scenario 1.
    if print_on == 1: print("1, 1, ja, tap")                    
    bytte_tap += 1
elif scenario_valg == 1 and første_valg == 1 and andre_valg == 0:
    if print_on == 1: print("1, 1, nei, vinn")
    bli_vinn += 1
elif scenario_valg == 1 and første_valg == 2 and andre_valg == 1:
    if print_on == 1: print("1, 2, ja, tap")
    bytte_tap += 1
elif scenario_valg == 1 and første_valg == 2 and andre_valg == 0:
    if print_on == 1: print("1, 2, nei, vinn")
    bli_vinn += 1
elif scenario_valg == 1 and første_valg == 3 and andre_valg == 1:
    if print_on == 1: print("1, 3, ja, vinn")
    bytte_vinn += 1
elif scenario_valg == 1 and første_valg == 3 and andre_valg == 0:
    if print_on == 1: print("1, 3, nei, tap")
    bli_tap += 1



if scenario_valg == 2 and første_valg == 1 and andre_valg == 1: # Figures out if the player has a correct combination of choices for scenario 2.
    if print_on == 1: print("2, 1, ja, vinn")                  
    bytte_vinn += 1
elif scenario_valg == 2 and første_valg == 1 and andre_valg == 0:
    if print_on == 1: print("2, 1, nei, tap")
    bli_tap += 1
elif scenario_valg == 2 and første_valg == 2 and andre_valg == 1:
    if print_on == 1: print("2, 2, ja, tap")
    bytte_tap += 1
elif scenario_valg == 2 and første_valg == 2 and andre_valg == 0:
    if print_on == 1: print("2, 2, nei, vinn")
    bli_vinn += 1
elif scenario_valg == 2 and første_valg == 3 and andre_valg == 1:
    if print_on == 1: print("2, 3, ja, vinn")
    bytte_vinn += 1
elif scenario_valg == 2 and første_valg == 3 and andre_valg == 0:
    if print_on == 1: print("1, 3, nei, tap")
    bli_tap += 1


if scenario_valg == 3 and første_valg == 1 and andre_valg == 1:  # Figures out if the player has a correct combination of choices for scenario 3.
    if print_on == 1: print("3, 1, ja, vinn")                    
    bytte_vinn += 1
elif scenario_valg == 3 and første_valg == 1 and andre_valg == 0:
    if print_on == 1: print("3, 1, nei, tap")
    bli_tap += 1
elif scenario_valg == 3 and første_valg == 2 and andre_valg == 1:
    if print_on == 1: print("3, 2, ja, vinn")
    bytte_vinn += 1
elif scenario_valg == 3 and første_valg == 2 and andre_valg == 0:
    if print_on == 1: print("3, 2, nei, tap")
    bli_tap += 1
elif scenario_valg == 3 and første_valg == 3 and andre_valg == 1:
    if print_on == 1: print("3, 3, ja, tap")
    bytte_tap += 1
elif scenario_valg == 3 and første_valg == 3 and andre_valg == 0:
    if print_on == 1: print("3, 3, nei, vinn")
    bli_vinn += 1

Вместо того, чтобы разбивать каждое возможное сценарий для каждого выбора, вы можете сделать меньше проверок (и, таким образом, написать меньше кода).Я бы

    1. Проверьте правильность первого выбора
  • Проверка на повторение

После того, как ваши сценарии разделены на эти 4 варианта, вы можете проверить выигрыши и распечатать переменные scenario_valg и første_valg напрямую вместо жесткогокодирует отпечатки для «1» и «2».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...