龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

在1-36之间的36个数,随机选出5个,使其总和为

时间:2014-07-22 14:52来源: 作者: 点击:
分享到:
p本来是一个朋友让帮忙在excel里写个方法:在1-36之间的36个数,随机选出5个,使其总和为100:/p p本人不太会用excel,所以尝试用php写一个方法:/p pstrongspan style=color:#ff0000;设想:/span/s

本来是一个朋友让帮忙在excel里写个方法:在1-36之间的36个数,随机选出5个,使其总和为100:

本人不太会用excel,所以尝试用php写一个方法:

设想:如果五个数都在20左右波动,波动值相互抵消,那么随机数就好求的了。

思路:a_random+b_random+a_offset+c_random+b_offset+d_random+c_offset+e_random

其中 a_offset是a_random与中间值20的波动值,那么表示 a_random+a_offset=20,同理b_random+b_offset=20等等

那么最后 (a_random+a_offset)+(b_random+b_offset)+(c_random+c_offset)+d_random+e_random=60+d_random+e_random;

最后一个数e_random不是随机出来的,是由100-60-d_random得来,那么只需随机出d_random再再判断一下是否符合要求即可了。
如果大家有更好的方法,可以跟帖告诉我,谢谢!


<?php
// 参数设置
$total=100;
$min_num=1;
$max_num=36;
$times=5;

$average=$total/$times;
$now=0;
for($i=0;$i<$times;$i++)
{
	$off=0;
	$tmp=0;
	if($i==$times-1)
	{
		$tmp=$total-$now;
		if($tmp>$max_num||$tmp<0)
		{
			$off=$now=0;
			$i=0;
			// echo "$tmp|";// 不符合要求的数据
			unset($num);
			$tmp=rand($min_num,$max_num);
			$off=$tmp-$average;
			$now=$now+$tmp;
			$num[]=$tmp;
			continue;
		}
		else
		{
			$num[]=$tmp;
			break;
		}
	}

	if($off==0)
	{
		$tmp=rand($min_num,$max_num);
	}
	else
	{
		$tmp=rand($min_num-$off,$max_num-$off);
		$tmp=($tmp+$off);
	}
	$off=$tmp-$average;
	$now=$now+$tmp;
	$num[]=$tmp;
}

// 测试
$con='';
foreach($num as $val)
{
	$total_my=$total_my+$val;
	echo $con."$val";
	$con="+";
}
echo '='.$total_my;
exit;
?>
精彩图集

赞助商链接