Дилемма 100 заключенных: кодекс всегда приводит к провалу (все заключенные умирают)

Я хочу посмотреть, приводит ли стратегия, заключающаяся в том, что каждый заключенный сначала выбирает коробку со своим номером, а затем открывает коробку с номером, содержащимся в предыдущей (и т. д.), действительно приводит к успеху в 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 и программировании в целом.

🤔 А знаете ли вы, что...
Python имеет богатую стандартную библиотеку, включая модули для работы с текстом, файлами и сетями.


1
51
1

Ответ:

Решено

Вы проверили, что открытый ящик — это тот самый ящик, а не ящик заключенного. Измените строку if boxopen == random1[boxopen]: на if prisoner == random1[boxopen]:.


Интересные вопросы для изучения

Как устранить ошибку AttributeError: у модуля «Фиона» нет атрибута «Путь»?Я работаю над тем, чтобы сделать бота Python, который будет нажимать кнопку в списке, который повторяется сам, используя селенКакие замены регулярных выражений помогают при переписывании SQL-запросов MS Access как простых запросов TSQL? Как их можно зациклить с помощью Excel в качестве входных и выходных данных?Сообщение об ошибке с использованием нескольких замен строк %sДолжны ли классы аутентификации и классы разрешений в представлениях Django REST Framework определяться с помощью списков или кортежей?Есть ли сценарий, в котором `foo in list(bar)` нельзя заменить на `foo in bar`?Выполняется ли простое задание в Python дважды?Итерация (или нет?) параметров для matplotlib для построения функции в PythonУстановка ограничения рекурсии не работает в автономном интерпретаторе Python, но работает в онлайн-интерпретаторахКак вернуть результат от конечной точки fastapi, обрабатывающей массив чисел int32?