数学建模社区-数学中国

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

作者: 思考者-Instrive    时间: 2014-9-18 17:07
标题: 用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科:
1 o  u/ V; p8 f三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。
) B% F( v# |& s# l
1 d; ]0 n* E7 G) S- ^鄙人谈几句话:: K; p3 K% `* g, }& B6 r
很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。
5 q5 y6 l( b: G3 ?# E0 B, l, {& N% Z
以下是鄙人的python模拟程序:
+ e/ I* w9 X) ^( a0 p+ f" t       #Author : Naupio
0 e* ?  k/ D1 W- Pimport random as rd
/ J2 U; E. s3 uchange = True0 z2 M9 E% d  r6 I' N1 c; c5 D* z
def moni(times=10000):
# m, f# O. B) S    counts = 0.04 g' ?* z( j! x
    for i  in range(times):& o2 U$ i5 q) H% Z/ i/ n8 a5 i
        rightaim = int(rd.random()*3)  #汽车所在的门1 Q: b$ }0 @' l/ V
        guss = int(rd.random()*3)      #第一次猜的门$ V3 z7 [" H2 Z" ~
        aim=[0,1,2]                    #初始化三个门$ c& }$ v) R' C% L/ N/ \0 y
               
$ Y. g! v, }$ y: n$ ]        #找出要主持人打开的门 . [# d( `: ~9 U" z( R
        for j in aim:
* w9 H' [+ ?0 d4 O$ o% f# B            if (j!=guss and j!=rightaim):  z$ z# m8 F3 {/ _8 i, V  V( v6 r
                openaim = j
5 K: T/ O4 M) d5 ?( ]                break
8 A8 \+ m8 [; R& {; A  
2 q! s" t1 R" }: z        #找出另一个门 * V' Y9 Z4 a2 y+ v) a" \1 h9 A
        for j in aim:( J4 A& {: `/ ?
            if (j!=guss and j!=openaim):: i* Q- k/ F  d
                otheraim =j" i4 @) Q( U' P5 q6 z0 g
                break
+ g4 S  A$ [9 F& B
; [( s7 Y* T! R7 K
! F/ R+ o  y3 l4 |        #改变选择 + r( N; W* C% l; `
        if change:: v3 o; B8 G) Y% E
            guss = otheraim
& K+ l$ P1 A9 q) j/ W5 _  O1 ^         
7 u3 a- P7 Z5 V4 \: y9 x# T% I        #改变选择之后猜中汽车的次数统计 6 u8 M& d/ h2 t+ ~
        if guss==rightaim:2 q, h9 O2 e7 N* A5 N, x
            counts+=15 |& m8 k$ r8 }$ n/ f1 f  z
        % ]5 k1 `9 n3 ^6 c
            #返回改变选择之后猜中汽车的概率
! Z# E  h3 O( ?' ^; o% L    return counts/times
: W6 L1 G/ H1 U! [) t% \print "改变选择之后的模拟一千次结果是:",moni(1000)6 r# c" @' d/ v" b& I
print "改变选择之后的模拟一万次结果是:",moni(10000)
, b* e- P  f) Y+ Bprint "改变选择之后的模拟十万次结果是:",moni(100000)& ^1 c5 J% M! C( H/ Z/ a  L, r+ ?
print "改变选择之后的模拟一百万次结果是:",moni(1000000)
3 G! R& I( ~. P+ k) Hprint "改变选择之后的模拟一千万次结果是:",moni(10000000)
0 b. A! j, K% Y, e* \
( @8 X" l+ K8 A* l  n以下是模拟效果截图: * g* o; A. i7 Q( g, c8 O; f- M

+ e5 M9 f' M% n( m6 Z
& Q1 o  z0 A, B* ^鄙人最后说几句:
( F1 T2 }2 E, ?& ~/ m  M 从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。* K4 r1 W. s) g1 b# b
@百年孤独 @数学中国—罂粟 @madio
, Z! j7 L8 |/ ]( E% m4 w# Xps:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。
# M# o4 @! S7 Y# `! h! ~

% r; R. e/ D5 S7 Z0 ^( O; a3 U# O

4 S+ j; R% O/ z+ a
! P: z2 v% N8 Q9 y- ~7 b




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