囚徒问题(100 prisoners problem)的python验证
密码学课上老师介绍了这样一个问题,囚徒问题(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
囚徒问题(100 prisoners problem)的python验证的更多相关文章
- Producer-consumer problem in Python
from: http://agiliq.com/blog/2013/10/producer-consumer-problem-in-python/ By : Akshar Raaj We will s ...
- 使用 Python 验证数据集中的体温是否符合正态分布
数据集地址:http://jse.amstat.org/datasets/normtemp.dat.txt 数据集描述:总共只有三列:体温.性别.心率 #代码 from scipy import st ...
- 用python验证蒙提霍尔问题
最初看到这个问题是初中的时候买了一本有关数学谜题的书里面概率论的一张的课后拓展就是说到三门问题,当时作为一个扩展阅读看了一下,里面说到了一个世界智商最高的女人秒杀了美国一大群的数学高材生的精彩故事(比 ...
- python验证卡普耶卡(D.R.Kaprekar)6174猜想
1955年,卡普耶卡(D.R.Kaprekar)对4位数字进行了研究,发现一个规律: 对任意各位数字不相同的4位数,使用各位数字能组成的最大数减去能组成的最小数,对得到的差重复这个操作,最终会得到61 ...
- Python验证数据的抽样分布类型
假如要对一份统计数据进行分析,一般其来源来自于社会调研/普查,所以数据不是总体而是一定程度的抽样.对于抽样数据的分析,就可以结合上篇统计量及其抽样分布的内容,判断数据符合哪种分布.使用已知分布特性,可 ...
- python验证登录
一个web2.0时代的网站,自然少不了用户注册,登录,验证的功能,那么python可以怎样实现登录验证呢 这里我们使用装饰器来做登录验证 网站构成 假设我们有这样一个网站,是一个类似与博客园这种多个用 ...
- 基于时间延迟的Python验证脚本
自己写的一段Python脚本,经常拿来验证一些sqlmap等工具跑不出数据的网站. GET类型: import urllib import urllib2 import time payloads = ...
- Python 验证线程是数据共享的
import os import time from threading import Thread # from multiprocessing import Process #通过对全局变量的修改 ...
- python验证代理IP
接上一篇保存的IP地址,进行验证 # -*- coding: utf-8 -*- import requests from threading import Thread import threadi ...
随机推荐
- MySQL复制表结构以及复制表等等
mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 1 CREATE TABL ...
- C#日志记录类
public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...
- 01.Django-基础
基础 1. 简介 Django是一个由Python写成的开放源代码的重量级Web应用框架. Django的目的是使常见的Web开发任务,快速和容易 2. 特点 MVC开发模式 内置进行快速web开发所 ...
- c# 优化代码的一些规则——字符串使用优化[四]
前言 在我们的程序中,经常使用到字符串,字符串的写法非常多,但是有一个问题就是我们写的字符串是否合适呢? 正文 内插符 介绍一个东西叫做内插字符,如下: static void Main(string ...
- 软件攻城狮究级装B指南
引言 装B于无形,随性而动,顺道而行,待霸业功成之时,你会发现:装B是牛B最好的的试金石. -- SuperDo 第一章.人间兵器(准备工具) <论语·魏灵公>:“工欲善其事,必先利其器. ...
- 2018京东校招Java笔试题
相比阿里巴巴,京东的题都是考研基础题,加上一点java基础知识和linux命令. 1. 单选题(19道题,每题2分): 1)4个并发进程都需要5个同类资源,则至少需要多少个资源,才不会导致死锁? 2) ...
- 【转】eclipse找不到或无法加载主类
Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法! 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,bin文件夹下没有.class文件,至少遇到3次这个问题了 ...
- A barrier for Mobile Forensics - Samsung Secure Folder
Since I mentioned about "Second Space", let's take a look at Samsung "Secure Folder&q ...
- 【HIVE】(2)分区表、二级分区、动态分区、分桶、抽样
分区表: 建表语句中添加:partitioned by (col1 string, col2 string) create table emp_pt(id int, name string, job ...
- Linux (四) 基础命令 下
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.查看文件内容 1.命令 cat 对应单词:concatenate 作用:查看文件内容 常用参数: ...