本来是一个朋友让帮忙在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再再判断一下是否符合要求即可了。 如果大家有更好的方法,可以跟帖告诉我,谢谢!
- // 参数设置
- $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;
- ?>
|