public static class 成功机会选择概率问题 { const int Size = 3; //wall数 const int Award = 1; //奖品数 /// <summary> /// 进行一次测试。 /// </summary> /// <returns>返回两个bool结果:1. 如果不改变选择,是否猜中;2. 如果改变选择,是否猜中。</returns> private static Tuple<bool, bool> testc() { var gates = (from n in Enumerable.Range(0, Size) orderby Rnd.Next() select n < Award).ToList(); var guess = Rnd.Next(0, Size); //首先猜测选择这个 int open = (from n in Enumerable.Range(0, Size) where n != guess && !gates[n] select n).First(); //选择这个门打开 int newGuess = (from n in Enumerable.Range(0, Size) where n != guess && n != open orderby Rnd.Next() select n).First(); return new Tuple<bool, bool>(gates[guess], gates[newGuess]); } static Random Rnd = new Random(); static void t1() { var cn = 10000; //进行1万次反复测试 var game = Enumerable.Range(0, cn).Select(x => testc()).ToList(); var result1 = game.Count(x => x.Item1); //不改变决定成功次数 var result2 = game.Count(x => x.Item2); //改变决定成功次数 Debug.Assert(result2 > result1 + 3000); }}执行 t1,你会发现断言通过了——没有异常!这就说明,如果修改决定,至少比坚持决定多3000次机会胜出。不过这有前提。生活总是跟你使诈,并不一定有人给你正确地指出哪一个门后边是山羊。
另外我特意把 Size 和 Award 设置为变量。你可以改变参数试试看,例如将Size设置为5并且将Award设置为3,会是什么结果?你可以看到,假设只有3个门,并且只有一个门后边有奖品,那么这个概率差距确实很大(大于30%)。但是假设门越来越多,奖品数越来越大,那么修改决定和不修改决定的结果概率,就越来越接近了。这说明有些人很偏执,只给自己留很少的“门”,她自然就是和天生的叛徒。
{
const int Size = 3; //wall数
const int Award = 1; //奖品数 /// <summary>
/// 进行一次测试。
/// </summary>
/// <returns>返回两个bool结果:1. 如果不改变选择,是否猜中;2. 如果改变选择,是否猜中。</returns>
private static Tuple<bool, bool> testc()
{
var gates = (from n in Enumerable.Range(0, Size)
orderby Rnd.Next()
select n < Award).ToList();
var guess = Rnd.Next(0, Size); //首先猜测选择这个
int open = (from n in Enumerable.Range(0, Size)
where n != guess && !gates[n]
select n).First(); //选择这个门打开
int newGuess = (from n in Enumerable.Range(0, Size)
where n != guess && n != open
orderby Rnd.Next()
select n).First();
return new Tuple<bool, bool>(gates[guess], gates[newGuess]);
} static Random Rnd = new Random(); static void t1()
{
var cn = 10000; //进行1万次反复测试
var game = Enumerable.Range(0, cn).Select(x => testc()).ToList();
var result1 = game.Count(x => x.Item1); //不改变决定成功次数
var result2 = game.Count(x => x.Item2); //改变决定成功次数
Debug.Assert(result2 > result1 + 3000);
}}执行 t1,你会发现断言通过了——没有异常!这就说明,如果修改决定,至少比坚持决定多3000次机会胜出。不过这有前提。生活总是跟你使诈,并不一定有人给你正确地指出哪一个门后边是山羊。
谢谢sp大神的回复.我觉得你这个是不对的.
这是我的测试:+++++++++++++++++
False
False
True
+++++++++++++++++
False
False
True
+++++++++++++++++
False
False
True
+++++++++++++++++
False
False
True
+++++++++++++++++
False
False
True
+++++++++++++++++
True
False
False
+++++++++++++++++
False
False
True
+++++++++++++++++
True
False
False
+++++++++++++++++
False
False
True
+++++++++++++++++
True
False
False
3
7
请按任意键继续. . .
模拟游戏十次.
按你注释的意思.
其中坚持不变的,一次也没中.
换门的,中了7次.
但是最后打印出来说:坚持不变的中了三次.
应该是第一次开门就开中了三次.而且你这个有点混乱,第一次开门就中的应该过滤掉.
我运行你这个程序,
坚持不变的中的概率怎么远低于30分之1.我设置游戏30次.运行好几次都没中过一次.