Python解决数学难题:囚徒存活的概率 ‘‘‘

100个囚徒身上有编号从0至99,各不相同。一个刻意里有100个盒子,各有编号从0至99,各不相同,每个盒子中都有一张卡片,上面的数字从0至99,各不相同,卡片是打乱了顺序放在盒子里的。每个囚徒需要独自进入房间,打开其中50个盒子,如果打开的盒子中的卡片有与囚徒身上的号码相同,就属于成功完成任务。如果打开的50个盒子中的所有卡片,都没有囚徒身上的号码的数字,就属于任务失败。不论任务成功还是失败,囚徒都需要把卡片原样入入盒子并离开房间。如果所有的囚徒都成功完成任务,所有囚徒都能活;如果有哪怕一个囚徒任务失败,则所有囚徒立即处死。囚徒可以在完成任务前商量好行动的策略,但第一个囚徒进入房间开始打开盒子时起,所有囚徒就再不能彼此交流。

如果囚徒进入房间后,只是随机地打开50个盒子,那么他能成功完成任务的概率就只有50%,这样如果100个囚徒都能成功完成任务的概率,只有50%的100次方,这个概率比1个人在体彩中买一张彩票中500万,连买4期,期期都中的概率还要小。也就是说,用随机开盒子的方法,所有囚徒都能成功完成任务,并活下来的可能性几乎没有。

囚徒们要运用怎样的数学策略,提升整体的成功完成任务的概率呢?`‘’’
import random as R

#构建0至99号共100个盒子,
k=[i for i in range(100)]
#记录所有囚徒能活的次数
totaltime=0
#进行10万次试验
for i in range(100000):
#把盒子里的卡片打乱顺序
R.shuffle(k)
#记录100个囚徒中,任务成功的人数
total=0
#循环每个囚徒进入房间开始做任务
for manID in range(100):
该囚徒任务是否成功的标志
life=False
#囚徒可以打开50次盒子
openboxtimes=50
#囚徒身上的标志与打开第一个盒子的号码
openboxID=manID
#循环判断囚徒还有完成任务的机会
while openboxtimes>=0 and lifeFalse:
#判断,如果囚徒身上的号码与打开的盒子中卡片上的数字相同
if k[openboxID]manID:
#设置任务成功标志
life=True
#否则
else:
#记录打开的盒子数减少1
openboxtimes-=1
#把刚打开盒子中的卡片上的数字设置为下一次将要打开的盒子
openboxID=k[openboxID]
#判断囚徒是否最终任务成功
if life
True:
#如果是成功完成任务,把完成任务的人数增加1
total+=1
#判断如果所有的囚徒都成功完成任务
if total
100:
#则把所有囚徒都能活的次数加1
totaltime+=1
#显示在10万次试验中,所有囚徒都能活的次数
print(totaltime) ''' 本程序运行大约需要60秒,中间有效率不高的地方,主要就是当某一囚徒任务失败后,还继续让后面的囚徒继续进入房间去完成任务,这显然不合理了。因为只要有一个囚徒任务失败,则所有囚徒就算任务失败了。于是修改程序,提高执行效率。有了下面这个新版本: '''import random as R

k=[i for i in range(100)]
totaltime=0
for i in range(100000):
R.shuffle(k)
lifeall=True
manID=0
while manID<100 and lifeallTrue:
life=False
openboxtimes=50
openboxID=manID
while openboxtimes>=0 and life
False:
if k[openboxID]manID:
life=True
else:
openboxtimes-=1
openboxID=k[openboxID]
manID+=1
if life
False:
lifeall=False
if lifeall==True:
totaltime+=1
print(totaltime)`
经过改进,程序只需要19秒即可完成10万次试验。效率提高不少。
最终运行结果证明,运用正确的数学策略,所有囚徒都能活的概率大约是33%

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值