小马驹会飞学算法与数据结构之编程题练习_001

写在开头:
个人觉得编程题是考察程序员编程能力的有效方式,能力源于积累和发散。本系列编程题求解过程均使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值