Я хочу посмотреть, приводит ли стратегия, заключающаяся в том, что каждый заключенный сначала выбирает коробку со своим номером, а затем открывает коробку с номером, содержащимся в предыдущей (и т. д.), действительно приводит к успеху в 31% случаев. Таким образом, я хотел воссоздать стратегию на Python и повторить ее 1000 раз. (Обратите внимание, что я сохраняю результаты каждого испытания в списке для последующего суммирования, хотя я еще не суммирую их здесь).
import random
boxesnum = list(range(100)) #generate list of 100 boxes
outcomes = [] #create empty list to store outcome of each iteration
for i in range(1000): #iterate process 1000 times
random1 = list(range(100))
random.shuffle(random1) #generate list of numbers from 0 to 99 and shuffle them randomly
boxes = dict(zip(boxesnum,random1)) #create dictionary mapping each box to a number randomly shuffled
lastprisoner = 0 #initialize count of prisoners who successfully find their number in the boxes
for prisoner in boxesnum:
boxopen = prisoner #let prisoner start "opening" boxes from the one with his own number (prisoners numbered from 0 to 99)
boxesopened = 0 #initialize count for number of boxes opened by each prisoner
while boxesopened < 50: #let prisoner open up to 50 boxes
if boxopen == random1[boxopen]: #if the prisoner opens a box with his own number, skip to next prisoner and add 1 to count of successful prisoners
lastprisoner += 1
break
else:
boxopen = random1[boxopen] #next box the prisoner opens is box #(number contained in previous box)
boxesopened += 1 #update count of boxes opened by the prisoner
else:
print("All prisoners are dead!") #if prisoner has to open more than 50 boxes, stop iteration and all prisoners die
outcomes.append(0) #add 0 to list of outcomes of each trial
break
if lastprisoner == 100:
print("Success!")
outcomes.append(1) #if all prisoners are successful, add 1 to list of outcomes of each trial
print(outcomes)
Проблема в том, что он возвращает только неудачи (все заключенные умирают в каждом из 100 испытаний), в то время как реализованная стратегия должна иметь показатель успеха 31%.
Я действительно не могу понять, почему этот код не работает.
Может ли быть проблема с тем, как метод «перетасовывания» рандомизирует содержимое ящиков?
Примечание. Я новичок в Python и программировании в целом.
@0stone0 Нет, это правда.
@0stone0 Вы имеете в виду внутри самого внешнего цикла range(1000)
? Цель этого цикла — запустить симуляцию 1000 раз, поэтому имеет смысл генерировать новые данные для каждой новой симуляции.
Сократите количество коробок до того уровня, который вы сможете сделать самостоятельно с помощью ручки и бумаги. Пока вы это делаете, замените в своем коде так называемые магические числа. Затем используйте отладчик для пошагового выполнения кода. Если это по-прежнему не помогает, замените генератор случайных чисел чем-то более статичным, что дает гарантированно успешный результат.
Кстати: как только вы запустите этот код, вы также можете отправить его на codereview.stackexchange.com. Я уверен, что есть что улучшить, но это не связано напрямую с ошибкой, которую вы пытаетесь найти. Обязательно сначала изучите их правила сайта, которые отличаются от приведенных здесь!
Не все знают эту загадку. Было бы хорошо кратко описать это, чтобы люди могли понять ваш вопрос.
Вы проверили, что открытый ящик — это тот самый ящик, а не ящик заключенного. Измените строку if boxopen == random1[boxopen]:
на if prisoner == random1[boxopen]:
.
Вы генерируете случайные блоки внутри цикла, разве это не следует сделать один раз?