写在开头:
个人觉得编程题是考察程序员编程能力的有效方式,能力源于积累和发散。本系列编程题求解过程均使用PHP实现。
题目描述:
10个房间里放着随机数量的金币。每个房间只能进入一次,并只能在一个房间拿金币。一个人采取如下策略:前四个房间只看不拿。随后的房间只要看到比前四个房间都多的金币数,就拿。否则就那最后一个房间的金币。编程计算这种策略拿到最多金币的概率。
分析:
这道题是一个求概率的问题,由于10个房间里放的金币数是随机的,首先生成10个随机数模拟10个房间里金币的数量。然后判断通过这种策略是否能拿到最多的金币。实验结果需要做多次实验,通过记录模拟的次数m,拿到最多金币的次数n,从而可以计算出拿到最多金币的概率n/m。实验结果与金币数和模拟次数均有关系,模拟次数越多,越能接近真实值。
代码实现:
<?php
/*
函数功能:把数组a看成房间,总共有n个房间,判断用指定的策略是否能拿到最多金币
返回值:如果能拿到就返回1,否则返回0
*/
function getMaxNum($a,$n){
//随机生成10个房间里的金币数
for($i=0;$i<$n;$i++){
$a[$i] = rand()%10+1;
}
//找出前四个房间里最多的金币个数
$max4 = 0;
for($i=0;$i<4;$i++){
if($a[$i]>$max4){
$max4 = $a[$i];
}
}
for($i=4;$i<$n-1;$i++){
if($a[$i]>$max4){
return 1;
}
}
return 0;
}
$a = [];
$monitorCount = 1000;
$success = 0;
for($i=0;$i<$monitorCount;$i++){
if(getMaxNum($a,10))
$success++;
}
printf("%f\n",$success/$monitorCount);
由于本题目是随机问题,因此程序每次运行的结果都不相同。程序运行结果:
0.444000