数学建模社区-数学中国

标题: 用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/ {; Schange = 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 =j3 ~/ l- m2 Q0 F+ a9 f0 `
                break
# X( C; G  E/ G+ G
8 _+ C5 P- Z1 O4 P  X) Z4 Y6 Q; `! h* b# c  E1 R" `4 T4 ]
        #改变选择
% ^8 @/ {" E3 ?3 u+ g        if change:
, b0 W" Z7 p. {; h$ _$ ^            guss = otheraim0 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. jprint "改变选择之后的模拟一千次结果是:",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, dprint "改变选择之后的模拟一百万次结果是:",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