密码学课上老师介绍了这样一个问题,囚徒问题(100 prisoners problem):一百个囚徒被关在牢房里,典狱长给他们最后一次机会,100人依次进入一个有100个抽屉的牢房,每个抽屉置乱放入1~100的号码,每个人依次打开50个抽屉,如果每个人都能找到自己的号码(0~100),则所有人被释放,反之所有人都会被杀死。

  典型的算法给出的被释放概率几乎为零,但是有这样一种方法:第i号囚徒打开第i号抽屉,如果这个抽屉放的是自己的号码牌,ok pass,如果不是,则打开该抽屉中号码牌对应的抽屉,依次进行,直到找到自己的号码牌或者失败。

  那么,这个方法的成功率有多少呢。使用python模拟的代码如下:

import random

flag = 0    # 单次实验是否成功flag
counter = 0 # 实验成功次数counter
fcounter = 0 # 单个囚徒打开抽屉次数fcounter
N = 10000 # 设置试验次数
A = list(range(100))
random.shuffle(A) # 抽屉置乱
for i in range(N):
flag = 1
# experiment begins
for j in range(100):
k = j
while(A[k] != j and fcounter < 50):
k = A[k]
fcounter += 1
if(fcounter >= 50):
flag = 0
fcounter = 0
break
fcounter = 0 if(flag == 1):
counter += 1
flag = 0
random.shuffle(A)
print('Success Rate: ' + str(counter/N))

  最终的成功率是惊人的

Success Rate: 0.3117

  这种方法的原理是什么呢,用置换的方法看,一次1~100置乱可以分解为若干个不相交的小循环。若所有小循环的阶都小于50,则囚犯都可以找到自己的号牌。

   囚徒遇到大于五十阶循环的概率如左所示,则囚徒们成功的概率达到了惊人的0.3118

最新文章

  1. rem与px的转换
  2. angular中自定义依赖注入的方法和decorator修饰
  3. php环境的搭建
  4. 5-26课堂作业——组员投票Alpha版存在的问题
  5. RegularHelper
  6. web安全测试
  7. JSTL核心标签库使用
  8. POJ 1041问题描述
  9. Mybatis Generator(定制化)代码生成器
  10. maven tomcat 插件实现热部署
  11. R.id.layout等不能识别:cannot be resolved or is not a field
  12. theano log softmax 4D
  13. bzoj 2707 [SDOI2012]走迷宫(SCC+高斯消元)
  14. [转]IIS上部署网站
  15. AngularJs的Select演示
  16. LightOJ 1370 Bi-shoe and Phi-shoe(欧拉函数)
  17. POJ 3625 最小生成树 Prim C++
  18. UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character &#39;\xbb&#39; in position 30633: illegal multibyte sequence
  19. sqlserver 多行转一行
  20. JWT验证

热门文章

  1. 【python爬虫】scrapy入门2--自定义item
  2. pip命令报错“no perl script found in input”
  3. Azure Kubernetes 服务 (AKS)
  4. 机器人操作系统——ROS,Robot Operating System
  5. JVM调优总结(三)-垃圾回收面临的问题
  6. Java IO(十六)InputStreamReader 和 InputStreamWriter
  7. Black Hat Python之#2:TCP代理
  8. PAT1065 单身狗 (25分) 思路记录——参考大神柳婼
  9. Rocket - config - implicit Parameters
  10. treegrid树形表格的完美运用