Big Fish

Friday, June 05, 2009

概率问题

有个经典概率问题是这样的:三个门,其中一个后面是轿车,另外两个后面是山羊,你任选一个门,如果打开了后面是汽车,汽车就归你。你选了一个门后,主持人打开了另一个门,后面是山羊。这时他给你一个机会更改自己的选择,你要坚持自己一开始的选择还是更改自己的选择?这个问题很有名,比如电影21里面也提到过(btw, 这个电影很一般,没看过的就不用浪费时间了)。

答案是更改选择。因为不改的话你选对的概率是1/3,而改了你选对的概率变成2/3。

昨天杨爷不知道为啥又把这个问题翻出来了,然后跟我们讨论为啥不是1/2。我概率学的不够好,没找到足够让人信服的理由反驳他的1/2。不过我C语言学的比较好,而且正好今天休假比较闲,于是中午写了个程序模拟了一下。。。这个是跑很多次的结果:

fishy@Makelele:~/work/test$ ./test 100000
CHANGE
*** right on 66706 out of 100000, 66.71% ***
NO CHANGE
*** right on 33331 out of 100000, 33.33% ***
fishy@Makelele:~/work/test$ ./test 1000000
CHANGE
*** right on 667107 out of 1000000, 66.71% ***
NO CHANGE
*** right on 332750 out of 1000000, 33.28% ***
fishy@Makelele:~/work/test$ ./test 10000000
CHANGE
*** right on 6666707 out of 10000000, 66.67% ***
NO CHANGE
*** right on 3334351 out of 10000000, 33.34% ***

这个是只跑了20次但是给出具体内容的结果:

fishy@Makelele:~/work/test$ ./test 20 a
CHANGE
guess 1, show 0, changed to 2, result is 2
guess 0, show 1, changed to 2, result is 2
guess 1, show 2, changed to 0, result is 0
guess 0, show 1, changed to 2, result is 2
guess 0, show 2, changed to 1, result is 0
guess 1, show 2, changed to 0, result is 0
guess 2, show 0, changed to 1, result is 1
guess 0, show 1, changed to 2, result is 0
guess 2, show 0, changed to 1, result is 2
guess 0, show 2, changed to 1, result is 1
guess 0, show 2, changed to 1, result is 1
guess 0, show 2, changed to 1, result is 0
guess 0, show 2, changed to 1, result is 0
guess 1, show 0, changed to 2, result is 2
guess 0, show 2, changed to 1, result is 1
guess 0, show 1, changed to 2, result is 2
guess 2, show 1, changed to 0, result is 0
guess 2, show 1, changed to 0, result is 0
guess 1, show 0, changed to 2, result is 2
guess 0, show 2, changed to 1, result is 1
*** right on 15 out of 20, 75.00% ***
NO CHANGE
guess 2, show 1, changed to 2, result is 0
guess 1, show 2, changed to 1, result is 0
guess 1, show 0, changed to 1, result is 1
guess 1, show 2, changed to 1, result is 0
guess 0, show 2, changed to 0, result is 1
guess 2, show 0, changed to 2, result is 1
guess 1, show 0, changed to 1, result is 1
guess 0, show 2, changed to 0, result is 0
guess 1, show 2, changed to 1, result is 1
guess 0, show 1, changed to 0, result is 2
guess 1, show 2, changed to 1, result is 0
guess 0, show 1, changed to 0, result is 0
guess 1, show 2, changed to 1, result is 0
guess 0, show 1, changed to 0, result is 2
guess 0, show 1, changed to 0, result is 2
guess 1, show 0, changed to 1, result is 2
guess 0, show 1, changed to 0, result is 0
guess 1, show 0, changed to 1, result is 1
guess 0, show 2, changed to 0, result is 1
guess 0, show 2, changed to 0, result is 1
*** right on 7 out of 20, 35.00% ***

所以很显然了,换了猜对的概率是2/3,不换是1/3。

下面是程序

 1 #include <stdio.h>
 2 #include <time.h>
 3 #include <stdlib.h>
 4
 5 typedef int changefunc(int, int);
 6
 7 int change(int guess, int show) {
 8         return 0+1+2 - guess - show;
 9 }
10
11 int nochange(int guess, int show) {
12         return guess;
13 }
14
15 void loop(int times, changefunc func, int print) {
16         int i, n;
17         n = 0;
18         for(i=0;i<times;i++) {
19                 int target = rand() % 3;
20                 int guess = rand() % 3;
21                 int show, finalguess;
22                 if(guess != target)
23                         show = 0+1+2 - target - guess;
24                 else {
25                         show = guess + rand() % 2 + 1;
26                         if(show >= 3) show -= 3;
27                 }
28                 finalguess = func(guess, show);
29                 if(print)
30                         printf("guess %d, show %d, changed to %d, result is %d\n", guess, show, finalguess, target);
31                 if(target == finalguess) n++;
32         }
33         printf(" *** right on %d out of %d, %.2f%% ***\n", n, times, ((double)n)/times*100);
34 }
35
36 int main(int argc, char **argv) {
37         if(argc <= 1)
38                 return -1;
39         int times = atoi(argv[1]);
40         int print = (argc >= 3);
41         srand(time(0));
42         // change
43         printf("CHANGE\n");
44         loop(times, change, print);
45         // no change
46         printf("NO CHANGE\n");
47         loop(times, nochange, print);
48         return 0;
49 }

要是能天天都休假还有工资拿就好了。。。



tags: , , ,

00:05:00 by fishy - 程序网络 - 永久链接

得分: 11 (共13票,其中有92.31%的票喜欢这篇文章) [+/-]

引用通告:
Big Fish
概率问题(续): 昨天说的那个概率问题其实叫Monty Hall problem。昨天给的那个结果其实依赖于一个前提,就是主持人故意选择打开了有山羊的一个门。如果主持人只是随机/偶然/不小心打开了有山羊的一个门,这个问题叫做Monty Fall...
2009-06- 5 @ 12:40
使用这个地址来发送引用通告(右键点击,选择复制链接)。 如果你的blog系统不支持引用通告,你可以在这里手动添加。

boost

boost 写道

我们概率还是一起上的。。

Friday, June 05, 2009 01:34:13

800

800 写道

原来还能这样。。。。我数学里面就概率稍微好一点,对我来说算是最具体的了,高数线代都好抽象

Friday, June 05, 2009 08:57:05

å¾é£

徐风 写道

关键在于主持人是知道门后是什么,并且必须打开是羊的门

你用你2/3机会赌会选中羊,这时候主持人只能打开剩下那只羊的门,于是另外一个门肯定是车了

当然是换选择划算

Tuesday, June 16, 2009 11:30:53

QQ379563766

QQ379563766 写道

你不改 肯定是1/3 你改了 主持人选的 知道了答案
但你选的还不确定 那么是汽车的概率是1/2除以1/3
当然是2/3

Monday, July 13, 2009 22:55:43

QQ379563766

QQ379563766 写道

你不改 肯定是1/3 你改了 主持人选的 知道了答案
但你选的还不确定 那么是汽车的概率是1/2除以1/3
当然是2/3

Monday, July 13, 2009 22:56:21

添加评论



May the Force be with you. RAmen