数学建模社区-数学中国

标题: 用python模拟三门悖论 [打印本页]

作者: 思考者-Instrive    时间: 2014-9-18 17:07
标题: 用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科: " d# P. d$ @0 W" a
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。% x* i0 A" n$ k
: r' S6 S& ~) T# g
鄙人谈几句话:: v" Z1 M+ k; t' k3 f
很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。3 {. m# J; g* B' B' i# @1 U. x! c( u

8 z. {9 P, G( k以下是鄙人的python模拟程序: / |1 A6 y. r& s4 Y+ ]
       #Author : Naupio
/ J, Z+ g# A% C, s1 Rimport random as rd' D! R: T# f0 ?) H) f4 L% n# X
change = True  K3 q* _# F# |! R
def moni(times=10000):, C7 R/ p0 x3 x7 Z4 b& L
    counts = 0.09 d! X  e( ?7 H
    for i  in range(times):
8 P0 N- D+ o5 T) X# Y        rightaim = int(rd.random()*3)  #汽车所在的门$ E8 r; e9 q. c
        guss = int(rd.random()*3)      #第一次猜的门
8 a8 Z& I" w& L2 M        aim=[0,1,2]                    #初始化三个门
1 t  c3 N3 ~2 v               
7 J/ \. w* y& _, d        #找出要主持人打开的门 % p; t9 w- w/ O$ \7 D
        for j in aim:  e; @4 J: H/ s* U
            if (j!=guss and j!=rightaim):
5 [. C! Y8 D- `* ^: c                openaim = j
+ h4 i( H1 R3 x/ s# p( p% i                break) ?% R4 D2 q3 ?3 G; v) g1 u; i
  
) B0 h$ l. R& c# K" S% Q* F        #找出另一个门 . |& @' G( E7 l
        for j in aim:
" W  o9 k8 F3 C8 U- o0 Y            if (j!=guss and j!=openaim):- E6 t( V2 o( _, W+ Z
                otheraim =j
  Y' Q) p2 E  }2 w; v9 a: u& [( F                break$ B- r1 B/ n3 B+ o* g5 f+ A" D

; ~' c8 K/ g. v$ a! c6 t: B/ U3 R! H$ q/ R& k
        #改变选择 7 K" U9 l5 p7 S. i/ u
        if change:
# ~6 O) `' D, F% s5 w            guss = otheraim
2 K8 N! `8 M9 i. g4 h* D- P         " Y+ [3 I* z( S7 i5 r. F) [
        #改变选择之后猜中汽车的次数统计 3 l4 d& e" D1 f+ T1 h& S
        if guss==rightaim:
9 B% y/ Q' {+ ~  P5 h+ r0 s3 O+ m  c            counts+=16 @+ H5 I* |) R" N7 R, ~- i% i
        2 _( S( G+ y7 O$ m8 m0 R
            #返回改变选择之后猜中汽车的概率 % R; N' o7 @, r* P0 g+ R3 h3 ]
    return counts/times/ i0 ~9 f2 t- X. w
print "改变选择之后的模拟一千次结果是:",moni(1000)' q) b2 R( j5 ~# A  B5 j$ E& P
print "改变选择之后的模拟一万次结果是:",moni(10000)
& W8 B% }$ F5 o! w. k; tprint "改变选择之后的模拟十万次结果是:",moni(100000)
/ @2 s! k  a/ e; H; U7 A: B  {print "改变选择之后的模拟一百万次结果是:",moni(1000000)! k- U+ `7 G0 S
print "改变选择之后的模拟一千万次结果是:",moni(10000000) % W+ B# I4 d4 y2 n* z

  q3 O: j: W, S" K% I以下是模拟效果截图: & b" c' v9 s9 B* I
! d  `; }7 @7 q; ]/ @

1 z1 B8 l3 q) c% w9 `$ y6 Y鄙人最后说几句:- u6 h4 l" Z) N8 B9 N
从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。
4 y1 G2 Z2 g% G) N! @6 \$ ], I$ o: M
@百年孤独 @数学中国—罂粟 @madio
) c+ N- D  |( B8 t) S% bps:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。
) t8 g1 W/ @6 y  A
5 b( n) e' ?5 L5 H) ]

* V# I0 o: U+ H# J: b
' N* t/ _/ K- ]/ ?( D




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5