数学建模社区-数学中国
标题:
用python模拟三门悖论
[打印本页]
作者:
思考者-Instrive
时间:
2014-9-18 17:07
标题:
用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科:
1 o u/ V; p8 f
三门问题(Monty Hall problem)亦称为
蒙提霍尔问题
、蒙特霍问题或蒙提霍尔悖论,大致出自
美国
的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。
) B% F( v# |& s# l
1 d; ]0 n* E7 G) S- ^
鄙人谈几句话:
: K; p3 K% `* g, }& B6 r
很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。
5 q5 y6 l( b: G3 ?
# E0 B, l, {& N% Z
以下是鄙人的python
模拟
程序:
+ e/ I* w9 X) ^( a0 p+ f" t
#Author : Naupio
0 e* ? k/ D1 W- P
import random as rd
/ J2 U; E. s3 u
change = True
0 z2 M9 E% d r6 I' N1 c; c5 D* z
def moni(times=10000):
# m, f# O. B) S
counts = 0.0
4 g' ?* z( j! x
for i in range(times):
& o2 U$ i5 q) H% Z/ i/ n8 a5 i
rightaim = int(rd.random()*3) #汽车所在的门
1 Q: b$ }0 @' l/ V
guss = int(rd.random()*3) #第一次猜的门
$ V3 z7 [" H2 Z" ~
aim=[0,1,2] #初始化三个门
$ c& }$ v) R' C% L/ N/ \0 y
$ Y. g! v, }$ y: n$ ]
#找出要主持人打开的门
. [# d( `: ~9 U" z( R
for j in aim:
* w9 H' [+ ?0 d4 O$ o% f# B
if (j!=guss and j!=rightaim):
z$ z# m8 F3 {/ _8 i, V V( v6 r
openaim = j
5 K: T/ O4 M) d5 ?( ]
break
8 A8 \+ m8 [; R& {; A
2 q! s" t1 R" }: z
#找出另一个门
* V' Y9 Z4 a2 y+ v) a" \1 h9 A
for j in aim:
( J4 A& {: `/ ?
if (j!=guss and j!=openaim):
: i* Q- k/ F d
otheraim =j
" i4 @) Q( U' P5 q6 z0 g
break
+ g4 S A$ [9 F& B
; [( s7 Y* T! R7 K
! F/ R+ o y3 l4 |
#改变选择
+ r( N; W* C% l; `
if change:
: v3 o; B8 G) Y% E
guss = otheraim
& K+ l$ P1 A9 q) j/ W5 _ O1 ^
7 u3 a- P7 Z5 V4 \: y9 x# T% I
#改变选择之后猜中汽车的次数统计
6 u8 M& d/ h2 t+ ~
if guss==rightaim:
2 q, h9 O2 e7 N* A5 N, x
counts+=1
5 |& m8 k$ r8 }$ n/ f1 f z
% ]5 k1 `9 n3 ^6 c
#返回改变选择之后猜中汽车的概率
! Z# E h3 O( ?' ^; o% L
return counts/times
: W6 L1 G/ H1 U! [) t% \
print "改变选择之后的模拟一千次结果是:",moni(1000)
6 r# c" @' d/ v" b& I
print "改变选择之后的模拟一万次结果是:",moni(10000)
, b* e- P f) Y+ B
print "改变选择之后的模拟十万次结果是:",moni(100000)
& ^1 c5 J% M! C( H/ Z/ a L, r+ ?
print "改变选择之后的模拟一百万次结果是:",moni(1000000)
3 G! R& I( ~. P+ k) H
print "改变选择之后的模拟一千万次结果是:",moni(10000000)
0 b. A! j, K% Y, e* \
( @8 X" l+ K8 A* l n
以下是模拟效果截图:
* g* o; A. i7 Q( g, c8 O; f- M
+ e5 M9 f' M% n( m6 Z
& Q1 o z0 A, B* ^
鄙人最后说几句:
( F1 T2 }2 E, ?& ~/ m M
从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。
* K4 r1 W. s) g1 b# b
@百年孤独
@数学中国—罂粟
@madio
, Z! j7 L8 |/ ]( E% m4 w# X
ps:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。
# M# o4 @! S7 Y# `! h! ~
% r; R. e/ D5 S7 Z0 ^( O; a3 U# O
4 S+ j; R% O/ z+ a
! P: z2 v% N8 Q9 y- ~7 b
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5