数学建模社区-数学中国

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

作者: 思考者-Instrive    时间: 2014-9-18 17:07
标题: 用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科:
: v' r' n% q: f! [% V) `. @$ r三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。
# ~6 Q! [8 o& P2 o4 z+ m  T' i0 _1 o/ Z. `: D
鄙人谈几句话:
7 z; b# `9 x6 r% P$ ?9 f4 o很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。
7 h5 j( [# B' f, B  P) \" n7 q5 D6 [$ G* C' E4 r6 p8 q, Q
以下是鄙人的python模拟程序: ! R- H4 h" k$ h) j1 E8 _
       #Author : Naupio
0 J9 \: V8 Z$ R% y4 r) Q/ [import random as rd
5 ?: O: a0 l0 q; ochange = True5 q6 H: n" i2 K% `; a
def moni(times=10000):
- e. K& x* L! U$ X5 G" w  P/ ^    counts = 0.00 ?; r$ Y! B$ o5 Q
    for i  in range(times):+ C8 I6 s; l' r1 b4 l
        rightaim = int(rd.random()*3)  #汽车所在的门
: g" Y0 f" k$ x        guss = int(rd.random()*3)      #第一次猜的门
  R4 G5 v0 _6 T0 N/ M. d9 H        aim=[0,1,2]                    #初始化三个门) U/ m2 U, h5 R6 o8 V
               7 h$ x! G  @& O6 h" l  }4 B7 ~  J
        #找出要主持人打开的门
& D$ p  W1 u0 e; o        for j in aim:% }, I: X4 x- Q$ A. q' w
            if (j!=guss and j!=rightaim):
- L: `) k9 m  y2 G: ?& l                openaim = j* [6 F5 R* P! q9 F4 O7 e, X2 e
                break# j( k8 R3 S) g2 p
  & r) o" f, w1 P9 L9 \) A) ?: u
        #找出另一个门 7 s% u! W8 |$ ?6 V4 |3 U
        for j in aim:
5 E! L; W- y) s& t            if (j!=guss and j!=openaim):, C" _" W4 b. J2 p/ r* w( Q
                otheraim =j
8 [- o% n$ H( ~2 S: A, ^! V! A- A$ N                break
5 P' W5 p! `3 l0 R  B
& w8 Q, s0 s$ p8 W  _- z
8 i! z) Z# K: d; {% {- `7 s        #改变选择 % z8 x5 m" A( S5 @
        if change:
0 \! }8 S+ C2 X/ T; P- s            guss = otheraim
( H1 q' O2 ^! l, T: B0 r7 D9 i1 V7 N         : T% ?8 Y+ ?; P9 e* I1 Q) T
        #改变选择之后猜中汽车的次数统计
& V  I9 @' z' O. q! \# m- J$ G        if guss==rightaim:
$ }! h! w9 S& b5 z5 D" [            counts+=1
+ O+ f" k* o4 }6 h' _) `. U8 G$ c        ' Q6 l4 l2 U7 A; h) ], C
            #返回改变选择之后猜中汽车的概率 ; H2 n& v2 x" R: D3 J: q
    return counts/times
6 f; O* u7 X5 Y/ cprint "改变选择之后的模拟一千次结果是:",moni(1000)4 v0 Q2 F0 k! R
print "改变选择之后的模拟一万次结果是:",moni(10000)
8 Q# R6 S" D( mprint "改变选择之后的模拟十万次结果是:",moni(100000)
: h9 R. r, f' C, {2 T6 Pprint "改变选择之后的模拟一百万次结果是:",moni(1000000)
; h# c& ~4 e6 i' e! A" uprint "改变选择之后的模拟一千万次结果是:",moni(10000000) : V/ d( f7 y. N3 t' {  g: C- O* a# W

* h2 e+ T6 A; A7 n) i& c, l% j以下是模拟效果截图: ) p) h- U" U0 ^6 h) z/ z

7 x8 n: L( U9 x5 ~4 o
  b' ^' x  I" t' Z3 c鄙人最后说几句:' ?' a5 Y" h8 u7 O; Y) S; h) p' `
从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。
; t) S( y6 ]% P/ A5 ?$ F
@百年孤独 @数学中国—罂粟 @madio . A  h- S% I5 P( L9 {
ps:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。
4 ~( b) s: j% u

2 [: g8 g) x0 j. J: `6 \' Y% n1 p5 P+ U4 D

, }3 X! i: d% V9 w# S+ Q  r: u; o+ O& C





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