每一两天都要和同事打赌喝可乐,今天我们自己想了一个打赌方法,因为比较新鲜,打完之后喝着可乐想这个方式猜者猜中的几率,觉得还不是很好算,所以贴出来共享,有兴趣的也可以赌一赌,呵呵
方式为:
甲方从1—5这五个数中选出一个数写在纸上,然后乙方来猜,乙方有两次机会,每次猜一个数,乙方第一次如果没有猜对,甲方要告诉乙方自己写的数比乙方猜的数大还是小,乙方再猜,如果再没有猜对就算乙方输。
原帖地址:http://www.iteye.com/topic/63032
第一次猜1 或 5 的猜中概率是40%:
假如第一次猜1: 如果中了,就中了(概率1/5), 没中的话,再剩下的4/5 里面再猜,此时猜中的概率是1/4
故: 1/5+(4/5)*(1/4) = 2/5 = 40%
第一次猜5的情况类似
第一次猜3的猜中概率是 60%
第一次猜3:中的概率是1/5, 每种的话 再猜 此时猜中的概率是1/2
故: 1/5+(4/5)*(1/2) = 3/5 = 60%
第一次猜2或4的猜中概率是60%
假如第一次猜2: 如果中了,就中了(概率1/5), 没中的话,
剩下的有2种可能
a) 小于2的话,那只能是1了(概率是1)
b) 大于2的话 ,再剩下的3个里面猜 猜中的概率是 1/3
故: 1/5+( (1/5)*1 + (3/5)*(1/3) ) = 3/5 = 60%
=======================================
如果第一次是随机猜的话那么:
(1/5)*40%*2 + (1/5)*60%*3 = 0.52 = 52%
=======================================
以下是程序模拟:
<?php
$times = 1000000;
$hitTimes = 0;
for($i = 0; $i < $times; $i++)
{
$guessedNum = mt_rand(1,5);
$n = mt_rand(1,5);
if ($n == $guessedNum) {
$hitTimes++;
continue;
}
if ($n > $guessedNum && $n == mt_rand(($guessedNum+1>5?5:$guessedNum+1),5)) {
$hitTimes++;
} else if ($n == mt_rand(1,($guessedNum-1<1?1:$guessedNum-1)))
{
$hitTimes++;
}
}
echo '$hitTimes: ', $hitTimes, "\n";
echo '$times: ', $times, "\n\n";
echo '$hitTimes/$times:',$hitTimes/$times,"\n";
运行结果输出:
$hitTimes: 520787
$times: 1000000
$hitTimes/$times:0.520787
模拟1百万次, 命中率徘徊于 0.52左右 符合理论值。