Дилемма 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 и программировании в целом.

Вы генерируете случайные блоки внутри цикла, разве это не следует сделать один раз?

0stone0 04.09.2024 21:22

@0stone0 Нет, это правда.

no comment 04.09.2024 21:26

@0stone0 Вы имеете в виду внутри самого внешнего цикла range(1000)? Цель этого цикла — запустить симуляцию 1000 раз, поэтому имеет смысл генерировать новые данные для каждой новой симуляции.

John Gordon 04.09.2024 21:27

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

Ulrich Eckhardt 04.09.2024 21:37

Кстати: как только вы запустите этот код, вы также можете отправить его на codereview.stackexchange.com. Я уверен, что есть что улучшить, но это не связано напрямую с ошибкой, которую вы пытаетесь найти. Обязательно сначала изучите их правила сайта, которые отличаются от приведенных здесь!

Ulrich Eckhardt 04.09.2024 21:40

Не все знают эту загадку. Было бы хорошо кратко описать это, чтобы люди могли понять ваш вопрос.

no comment 04.09.2024 21:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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?