又见蒙特卡洛——python模拟解决三门问题

  三门问题很有意思,wiki用不同方法将原理讲的很透彻了,我跟喜欢其中这种理解方式:无论参赛者开始的选择如何,在被主持人问到是否更换时都选择更换。如果参赛者先选中山羊,换之后百分之百赢;如果参赛者先选中汽车,换之后百分之百输。而选中山羊的概率是2/3,选中汽车的概率是1/3。所以不管怎样都换,相对最初的赢得汽车仅为1/3的机率来说,转换选择可以增加赢的机会。

  原理明白了,实现就比较简单了,这次用python啦。

import random as rnd

strategy = [‘stick‘,‘choose‘,‘swith‘]
def MC(strategy,times):
	wins = 0
	for trail in range(times):
		# 假定,实际上奖品在0号门...但是我们并不知道...
		envelops = [0,1,2]
		# 第一次随机选取一扇门
		first_choice = rnd.choice(envelops)
		# 根据第一次的选择情况的不同,第二次宣策面临两种不同的备选组合

		# 如果第一次选择了0号门,那么在打开另外两个门中的一个空门后
		# 第二次将要在0号门和未打开的空门(1 or 2)中作出选择
		if first_choice == 0:
			envelops = [0,rnd.choice([1,2])]
		# 如果第一次没有选中0,那么此时被打开的必然是另一个空门,那么
		# 在第二次选择时,将在0和自己现在所处的门(first_choice)作出选择
		else:
			envelops = [0,first_choice]

		# 采取不同的策略进行第二次选择

		# 保持原来位置不变
		if strategy == ‘stick‘:
			second_choice = first_choice
		# 在除去一个空门后的两个门中,随机选择一个
		elif strategy == ‘choose‘:
			second_choice = rnd.choice(envelops)
		# 排除一扇空门后,放弃原来的选择,直接选择另一扇门
		elif strategy == ‘switch‘:
			envelops.remove(first_choice)
			second_choice = envelops[0]

		# 记得,奖品在0号门
		if second_choice == 0:
			wins += 1
	# 计算获奖的概率值
	p = wins/times
	print(‘第二次选择采用‘+strategy+‘方法,获奖的概率为:‘+str(p)+‘(模拟次数为‘+str(times)+‘)‘)

MC(‘stick‘,10000)
MC(‘choose‘,10000)
MC(‘switch‘,10000)

  输出如下:

  Wonderful!

时间: 2024-10-13 00:41:55

又见蒙特卡洛——python模拟解决三门问题的相关文章

python模拟163登陆获取邮件列表

利用cookielib和urllib2模块模拟登陆163的例子有很多,近期看了<python模拟登陆163邮箱并获取通讯录>一文,受到启发,试着对收件箱.发件箱等进行了分析,并列出了所有邮件列表及状态,包括发件人.收件人.主题.发信时间.已读未读等状态. 1.参考代码:http://hi.baidu.com/fc_lamp/blog/item/2466d1096fcc532de8248839.html%EF%BB%BF 1 #-*- coding:UTF-8 -*- 2 import urll

python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为

1.参考 autopy (实践见最后一章节) 用Python制作游戏外挂(上) AutoPy Introduction and Tutorial autopy.mouse.smooth_move(1, 1) 可以实现平滑移动 autopy - API Reference pip install PyUserInput SavinaRoja/PyUserInput [python3.5][PyUserInput]模拟鼠标和键盘模拟 Python-模拟鼠标键盘动作 autoit selenium借助

浅析HTTP中POST和GET区别并用Python模拟其响应和请求

最近在几周在做手游崩溃信息收集和上传,拿到崩溃信息后,使用的是HTTP的POST方法上传到公司共用的服务器的,因此做简单总结.本文首先简单介绍了HTTP协议,主要说明了POST方法和GET方法的区别:然后用Python实现了 对POST方法和GET方法的响应:最后用Python模拟了POST方法和GET方法的请求. HTTP协议简介 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,简单来说它是一个应用层的协议,它允许将超文本标记语言(HTML)文档从W

【Python模拟登录】RSA加密与重放方式登录 -以模拟登录博客园为例

Python模拟登录第一弹见:[Python数据分析]Python模拟登录(一) requests.Session应用上次的登录是最基本的,全部是明文,而且在浏览器中就可以看到POST的数据.接下来我们来个稍微难一点的–模拟登录博客园(http://www.cnblogs.com) 登录特点:用户名密码都进行了RSA加密,且在浏览器中无法看到POST数据 图1如上图,在post数据中不能显式看到POST内容. 模拟登录步骤 既然浏览器调试功能无法探测到POST数据,那么采用Fiddler试试看,

Python模拟HTTP Post上传文件

使用urllib2模块构造http post数据结构,提交有文件的表单(multipart/form-data),本示例提交的post表单带有两个参数及一张图片,代码如下: #buld post body data boundary = '----------%s' % hex(int(time.time() * 1000)) data = [] data.append('--%s' % boundary) data.append('Content-Disposition: form-data;

Python模拟登陆万能法-微博|知乎

Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解. 用到的库有"selenium"和"requests".通过selenium进行模拟登陆,然后将Cookies传入requests,最终用requests进行网站的抓取.优点就是不但规避了"selenium"其本身抓取速度慢的问题

Python模拟登陆万能法

此文转自:https://zhuanlan.zhihu.com/p/28587931   转录只是为了方便学习,感谢他的分享 Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解. 用到的库有"selenium"和"requests".通过selenium进行模拟登陆,然后将Cookies传入reque

利用Python模拟GitHub登录

最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要模拟一个网站的登录,我们必须要简单了解其大致过程. 在这里,我通过Fiddler来抓取GitHub登录的请求,从网页上登录的URL为:https://github.com/login ,抓包结果如下: 左边的是会话列表,右边的是请求和响应的数据.一般情况下,登录都是用POST请求,因为我在左边的会话列表中

python模拟进程状态

python模拟进程状态 代码 from transitions import Machine from collections import namedtuple class FsmState: def enter(self,event,fsm): pass def exit(self, fsm): pass class New(FsmState): def enter(self,event,fsm): print('New') def exit(self,fsm): print('Ready