You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

100囚犯困境代码全失败:为何策略未达31%成功率?

问题分析与代码修正

你的代码核心错误是囚犯成功的判断条件完全错误,这导致所有囚犯几乎不可能满足成功条件,最终每次试验都失败。

错误点详解

原代码里的判断:

if boxopen == random1[boxopen]:

这个条件是在检查「当前盒子的编号」是否等于「盒子里装的编号」(也就是排列的不动点),但囚犯要找的是自己的编号,不是这个无关的不动点。比如编号为3的囚犯,需要找到盒子里装着3的那个盒子,而不是找一个编号和内容相同的盒子。

另外还有一个小问题:盒子打开次数的计数逻辑有误。囚犯第一次打开自己编号的盒子时,已经消耗了一次打开机会,但原代码里只有在没找到时才计数,导致囚犯实际能打开51个盒子(不符合题目最多50次的限制)。

修正后的代码

import random

boxesnum = list(range(100))
outcomes = []

for _ in range(1000):
    random1 = list(range(100))
    random.shuffle(random1)
    
    success = True
    
    for prisoner in boxesnum:
        current_box = prisoner
        boxes_opened = 0
        
        while boxes_opened < 50:
            # 检查当前盒子里的内容是不是囚犯的编号
            if random1[current_box] == prisoner:
                break
            # 没找到的话,去打开盒子里编号对应的盒子
            current_box = random1[current_box]
            boxes_opened += 1
        else:
            # 这个囚犯开了50个都没找到,试验失败
            success = False
            break
    
    if success:
        print("Success!")
        outcomes.append(1)
    else:
        print("All prisoners are dead!")
        outcomes.append(0)

# 打印成功率验证
print(f"总试验次数:{len(outcomes)},成功次数:{sum(outcomes)},成功率:{sum(outcomes)/len(outcomes)*100:.2f}%")

修正说明

  1. 修正判断条件:把boxopen == random1[boxopen]改成random1[current_box] == prisoner,正确检查当前盒子里的内容是否是囚犯自己的编号。
  2. 调整计数逻辑:每次进入循环后先检查,没找到就更新下一个盒子并增加计数,确保囚犯最多打开50个盒子。
  3. 优化变量逻辑:用success标记直接判断试验是否成功,代码更简洁清晰。

运行修正后的代码,你会看到成功率稳定在30%-32%之间,符合预期的31%左右的概率。

内容的提问来源于stack exchange,提问作者BlueBruin8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:33:22