数学建模社区-数学中国
标题:
用python模拟三门悖论
[打印本页]
作者:
思考者-Instrive
时间:
2014-9-18 17:07
标题:
用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科:
2 M+ z8 x* l. | _
三门问题(Monty Hall problem)亦称为
蒙提霍尔问题
、蒙特霍问题或蒙提霍尔悖论,大致出自
美国
的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。
# t3 T4 {. l* I+ h
, M1 j2 W6 J( A( C3 _# h1 y
鄙人谈几句话:
8 N1 a( J. {; l" m1 Y9 L
很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。
# j3 @8 M# o- Z* {* P
7 k, Q2 S$ M& M+ N
以下是鄙人的python
模拟
程序:
/ s- ?" L. `( g; J1 `* l9 b
#Author : Naupio
- n5 O4 X9 I" D
import random as rd
# l: N) T j& h* U/ {; S
change = True
, q" z( I9 I- E6 _! s! N
def moni(times=10000):
3 `0 J& n# F, t$ n9 r
counts = 0.0
: O+ s& m' P+ C/ f
for i in range(times):
; e" L( S4 s3 H1 e: Z! @
rightaim = int(rd.random()*3) #汽车所在的门
! k* {4 ]0 O& O" Y L* d5 o6 K% b
guss = int(rd.random()*3) #第一次猜的门
" D2 @5 h" A0 J6 X A
aim=[0,1,2] #初始化三个门
0 u# `5 Z3 z3 @% m* B: B0 B
& F$ w L5 r6 O
#找出要主持人打开的门
6 V- y& [: g/ w0 d9 {2 x" C
for j in aim:
. ?( z9 d$ D; N: U4 D% a, A
if (j!=guss and j!=rightaim):
& k1 `1 `; R8 T1 ]
openaim = j
; z, J" M, B* }: G
break
3 a- u) ^* c4 `8 e* X6 y
& W W. @- N U! g5 V* w# i) z
#找出另一个门
! o; G V* @+ ~8 C, Z8 Z
for j in aim:
1 n \2 [5 I' x
if (j!=guss and j!=openaim):
7 u+ b7 A1 E& e" {7 R# w# N9 m
otheraim =j
3 ~/ l- m2 Q0 F+ a9 f0 `
break
# X( C; G E/ G+ G
8 _+ C5 P- Z1 O4 P X) Z4 Y
6 Q; `! h* b# c E1 R" `4 T4 ]
#改变选择
% ^8 @/ {" E3 ?3 u+ g
if change:
, b0 W" Z7 p. {; h$ _$ ^
guss = otheraim
0 p2 D# ]/ u9 ?5 K4 W; f
0 { w! q3 ]+ f' ]1 l
#改变选择之后猜中汽车的次数统计
: N0 f/ L: o1 F. w1 k
if guss==rightaim:
% _% ?$ | y3 @
counts+=1
, m6 Y, N0 k \- A
, U! U' k9 [) X* E
#返回改变选择之后猜中汽车的概率
3 ~' Z N, W: O! m2 O, O
return counts/times
9 F) r! a/ O/ K' C. j
print "改变选择之后的模拟一千次结果是:",moni(1000)
0 K6 t& z; X# d
print "改变选择之后的模拟一万次结果是:",moni(10000)
2 n% M Y' b: m- T# Q" H
print "改变选择之后的模拟十万次结果是:",moni(100000)
, Y7 V" B/ K8 f6 V( S, d
print "改变选择之后的模拟一百万次结果是:",moni(1000000)
; Y0 U" A" b% [
print "改变选择之后的模拟一千万次结果是:",moni(10000000)
% ^* Q. P1 t5 C7 i. {0 v
( n- ~/ f' F q
以下是模拟效果截图:
9 y7 Y& W/ O4 R$ I$ [, X2 j
M ^7 m O Y! z; z6 b$ s
: p9 k( k' n, d( F' {9 D
鄙人最后说几句:
3 N! L* ~& d1 _2 f; u
从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。
( x& V7 A2 ]3 ~, ?; t3 v
@百年孤独
@数学中国—罂粟
@madio
( b% C: U3 w0 X8 \- [
ps:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。
9 k. y9 S3 b7 D- @% }; J
$ h. ^: `# J" x5 r
3 p8 A$ ]6 y( s i0 z8 X# P# Y
[* p2 Q/ B9 }
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5