数学建模社区-数学中国
标题:
用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) \" n
7 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; o
change = True
5 q6 H: n" i2 K% `; a
def moni(times=10000):
- e. K& x* L! U$ X5 G" w P/ ^
counts = 0.0
0 ?; 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/ c
print "改变选择之后的模拟一千次结果是:",moni(1000)
4 v0 Q2 F0 k! R
print "改变选择之后的模拟一万次结果是:",moni(10000)
8 Q# R6 S" D( m
print "改变选择之后的模拟十万次结果是:",moni(100000)
: h9 R. r, f' C, {2 T6 P
print "改变选择之后的模拟一百万次结果是:",moni(1000000)
; h# c& ~4 e6 i' e! A" u
print "改变选择之后的模拟一千万次结果是:",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