数学建模社区-数学中国

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

作者: 思考者-Instrive    时间: 2014-9-18 17:07
标题: 用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科: ; i* A( K/ {, a, ]9 i4 t
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。
: {4 J- C0 b+ X/ M+ P
( Y5 \% J2 y8 B鄙人谈几句话:
- N+ {7 u, L/ J5 [3 A5 {很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。
- W; `9 w  z8 @% R! Q, K! y5 `& Y
以下是鄙人的python模拟程序: * ^; n1 `7 O- I7 w2 K
       #Author : Naupio8 ^, h6 }1 I/ V
import random as rd2 b% N' `% }2 c
change = True0 v& H* N, {( ?
def moni(times=10000):
4 K; r% o! _9 Q. V# o( y    counts = 0.0; C2 p: a$ I1 w' Y+ F, K: m  X
    for i  in range(times):" C2 y  X4 c7 s) ~, k2 U3 Z) j* I
        rightaim = int(rd.random()*3)  #汽车所在的门  f+ C  \7 E. T) i- H1 T
        guss = int(rd.random()*3)      #第一次猜的门
, d8 v% {, I$ c  y7 F; {        aim=[0,1,2]                    #初始化三个门% D& Z! d+ b+ W0 R6 a  a, x
               ) \& `/ A  F5 g1 V' Y
        #找出要主持人打开的门 7 m2 t) g0 w  a  ]
        for j in aim:- E6 q5 j6 }* \5 h% c7 M4 k, c% d
            if (j!=guss and j!=rightaim):
2 ^2 r  m' ~( d                openaim = j
, u2 V  A5 f2 e4 \                break5 w2 {9 Q" F0 i& G3 G, r$ V  u
  
/ T8 B0 P8 R; G3 i* B; ?        #找出另一个门
0 X- H' _7 o/ A9 g. P        for j in aim:, ]" ~2 Y( `7 F5 E8 Y& P7 ?6 y( G
            if (j!=guss and j!=openaim):- O7 |3 x6 A; C; @: T& J
                otheraim =j9 k6 |% y5 Y6 m0 M/ j  r. w3 l
                break
2 t2 P$ _- B# J) J, v, z1 H, \
" ?' I6 P5 F$ b* A) W1 b0 a' z; m
& x: Y$ V" i& v( L0 V        #改变选择 0 q  O* Z0 N9 t" ]; B. x
        if change:6 ~* l+ l2 P4 P& G$ @: w
            guss = otheraim
. c7 s' I! H! b4 x         
6 k9 |+ B$ x! A0 T: \& U1 h2 m        #改变选择之后猜中汽车的次数统计
( K, m% M! `+ S5 z6 `: j6 N* ]5 \        if guss==rightaim:
. t" `6 W! Q4 [* L9 n! ?            counts+=1" [$ k2 k" t& c* f
        
+ T4 X7 |$ T- V& F" s            #返回改变选择之后猜中汽车的概率
! s' d1 V$ e  L0 U    return counts/times! c8 L: j! Q0 J3 x( ^+ q, y: _1 c
print "改变选择之后的模拟一千次结果是:",moni(1000). \3 b5 l$ O7 a5 t: V+ y
print "改变选择之后的模拟一万次结果是:",moni(10000)
! R% T" `3 o; J5 J2 U5 Tprint "改变选择之后的模拟十万次结果是:",moni(100000)
8 O  u6 M1 q. P0 a+ b0 ]print "改变选择之后的模拟一百万次结果是:",moni(1000000)
# v# R+ R! j0 @& e( O7 Eprint "改变选择之后的模拟一千万次结果是:",moni(10000000)
; g/ j* ~$ W. M; Y' P& x% s! D
3 E1 ~$ n5 {( y4 `1 b! W以下是模拟效果截图: 8 e# n1 K5 q1 ?% G. V, ^

5 T  \. v2 X7 T9 r' \9 t$ }- k! a; r$ y. @# ^8 E( Q6 W
鄙人最后说几句:
' T4 C& ]+ D  g, y  d 从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。
6 H4 F% q' z% a1 t
@百年孤独 @数学中国—罂粟 @madio
. q0 r9 _- y3 |. P! ops:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。

+ a8 a  \8 O. p& a4 u) h% r$ j- \, q/ l; Z* `9 I
5 V% L* |  @$ G" Z0 M& p9 M: Z5 |

* t1 r7 w  P+ K" t+ q




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