Tout d'abord, ce programme est probablement stupide, inefficace et long, mais c'est mon premier vrai programme et si vous suggérez des changements dans le programme, gardez cela à l'esprit. et le texte est en norvégien. S'il y a quelque chose qui n'est pas clair, veuillez simplement demander et je traduirai plus.

Le code est écrit en jupyter en utilisant python 3, et présenté en utilisant complotement

J'ai lu ce thread tel qu'il décrit ma question mais je ne l'ai pas bien comprise, la réponse est peut-être là.

Question 1: Pourquoi ne retourne-t-il pas le bon ratio, devrait être de 33% et 66%. Actuellement, c'est environ 55% et 44%.

Question 2: Si vous deviez rendre cela plus simple mais toujours très basique, que feriez-vous?

Question 3: Secrets.randbelow (3) est-il "assez aléatoire" pour être utilisé de cette manière?

Question 4: Des suggestions sur la façon de mieux présenter les données?

Désolé pour le code en désordre et les fautes d'orthographe à l'avance. si le code est illisible, je suis heureux d'en traduire davantage.

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 %
1
Marius K 14 mars 2019 à 22:03

2 réponses

Meilleure réponse

Une façon plus élégante de l'écrire serait en quelque sorte comme ceci:

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)

Vous avez simplement besoin d'une variable de compteur où vous comptez soit les rounds où vous avez gagné, soit ceux où vous avez perdu. Ensuite, vous avez une boucle où vous avez deux nombres aléatoires. J'ai utilisé un tableau pour représenter les portes, mais vous pouvez également utiliser le nombre aléatoire qui sait derrière quelle porte se trouve la victoire. Vous n'avez alors besoin que d'un seul chèque. Si la porte que vous avez choisie est la porte derrière laquelle se trouve le prix, vous perdrez, car le modérateur ouvre alors une porte et vous passez à l'autre porte (sans rien derrière). Si vous n'avez pas choisi la porte avec le prix, vous gagnez car vous passez maintenant à la porte avec le prix. Ainsi, une grande partie des instructions if peuvent disparaître si vous n'avez pas besoin des impressions.

Question 3: secrets.randbelow est certainement assez aléatoire. C'est pour une telle chose peut-être même un peu exagéré, car vous n'avez pas besoin d'avoir des nombres aléatoires cryptographiques forts. Ainsi, vous pouvez également utiliser random ou la bibliothèque "random" de python.

2
Syrius 14 mars 2019 à 19:33

Pour votre question principale, les 33% et 66% sont-ils censés représenter le cas où le joueur choisit au hasard entre garder la porte actuelle ou changer ? Je pensais que ceux-ci étaient respectivement pour aucun interrupteur et interrupteur. Quoi qu'il en soit, cette partie de votre code pourrait être réalisée de manière beaucoup plus agréable :

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

Au lieu de diviser en chaque scénario possible pour chaque choix, vous pouvez faire moins de vérifications (et ainsi écrire moins de code). J'aimerais

    1. Vérifier que le premier choix est correct
    1. Vérifier la reprise

Une fois que vos scénarios sont divisés en ces 4 options, vous pouvez vérifier les gains et imprimer les variables scenario_valg et første_valg directement au lieu d'imprimer en dur pour "1" et "2".

0
Hoog 14 mars 2019 à 19:18