数学建模社区-数学中国

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

作者: 思考者-Instrive    时间: 2014-9-18 17:07
标题: 用python模拟三门悖论
直觉的欺骗,三门悖论的模拟
以下描述来自百度百科: / e' r9 t2 F6 a9 Z; g
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。换门的话,赢得汽车的机率是2/3。! K# h! V' i7 ~

/ \5 ?( B: `% ?/ n3 H1 H2 E鄙人谈几句话:) M" H: {) p8 B7 Y) K# I/ V
很多人都认为改变选择之后是二选一的情况,认为赢得汽车的概率是1/2,包括伟大的数学家鄂尔多斯都这样认为。但是我们要用事实来证明,如果真实做这个实验,会消耗太多资源,下面由鄙人用计算机编程来模拟这个情形。源码公开,如果有大神觉得不妥,欢迎指正。
* n8 v& N0 d" U7 j
% Z6 F- d7 e; D8 {5 z以下是鄙人的python模拟程序: 0 l8 `$ M5 h& Y
       #Author : Naupio
4 T2 \/ U5 \  N; u# [import random as rd
$ ?9 g2 G  U- ?( }" lchange = True
; ^+ ^% S) A- Y8 t2 M; Kdef moni(times=10000):
+ _: H' p0 Y& K! R/ H    counts = 0.0: K% y( t6 g( X4 g6 Q
    for i  in range(times):. f8 a5 Y: i% J5 W, i
        rightaim = int(rd.random()*3)  #汽车所在的门3 r$ @, s: O9 E  ~' d
        guss = int(rd.random()*3)      #第一次猜的门
  l& z4 [7 H( o$ V) `        aim=[0,1,2]                    #初始化三个门
/ x4 v! R3 x: A: I( t               
4 h5 C. ~1 B* i9 i        #找出要主持人打开的门
- C: K+ q# i5 ]# |$ {7 _# a        for j in aim:
6 O, R7 a6 y% u- r: j            if (j!=guss and j!=rightaim):
: u% c/ h7 {* p  r) p% T                openaim = j
. I( n% p4 x) {& v7 d" Y0 @                break9 M6 J. T) k3 E: Y
  ) }2 b3 u4 E/ b* w: i
        #找出另一个门 - C; A  O& `& D  B  w9 G
        for j in aim:
) ]- ~  f5 V- Z* j7 T: w            if (j!=guss and j!=openaim):
% D+ `+ ?% J5 _( k% C                otheraim =j4 N. h7 [1 L: x) d' Y4 Z7 p
                break
6 j# Y- }7 @7 J# x0 e# R* _; J
8 B; f% j. E  t. L  ^5 F4 f8 P; Q
        #改变选择
5 U# {1 |9 L+ B( M+ x+ q" ]0 }1 s        if change:# d% {9 i; h2 C6 F
            guss = otheraim
* _+ L) w  ?$ `1 s         
3 ^/ S9 j: {4 ?/ K/ a# p( i. A        #改变选择之后猜中汽车的次数统计 ! U5 C4 {/ e3 r
        if guss==rightaim:- d" ]) ]4 h: {5 a' y
            counts+=1
0 a  p# o+ b, l, _        
2 T3 c- C* n8 n) H  @            #返回改变选择之后猜中汽车的概率
0 p, R% ]+ _6 G2 l1 A+ A: G5 q    return counts/times
7 \; v) \- M& e) F9 |1 e. U& ~4 K& zprint "改变选择之后的模拟一千次结果是:",moni(1000)) `1 [& x9 K8 {1 }; N( Z
print "改变选择之后的模拟一万次结果是:",moni(10000)3 g, a8 V+ i5 ?+ p* [! U
print "改变选择之后的模拟十万次结果是:",moni(100000)+ J* e! s+ I. |7 s" @2 J
print "改变选择之后的模拟一百万次结果是:",moni(1000000)5 F  {- X7 \# o( h
print "改变选择之后的模拟一千万次结果是:",moni(10000000)
- [8 j8 I, z. f6 e- U1 r5 p$ V4 {* P8 z5 H5 P( e+ \
以下是模拟效果截图: / X6 v' c" e1 ]9 d1 S" m+ D3 y
6 q7 v7 c7 x2 \" d6 {% e
: t2 K* ^' N2 I: @
鄙人最后说几句:
+ ?1 L" Z  v7 G3 m) U4 D$ { 从模拟的结果上来看还算是成功的,随着模拟的次数越来越多,结果越来越接近2/3,本来想打算再提高模拟次数的,但由于我的本本比较渣,会卡爆,所以只模拟到一千万次。
: `+ e& P, h4 k& }
@百年孤独 @数学中国—罂粟 @madio
8 d4 c0 f1 @( }4 ups:不排除有错误,欢迎指正,欢迎交流,转载请注明出处,版权所有。

( }9 |7 |& m% o# j$ w' _3 Q
' [" D7 o% w# m+ k! H: S# [. H
. Q( s0 |* A: Q2 {* k

/ l1 |. W1 i/ A. I! x9 x




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