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

WBOY
풀어 주다: 2016-07-25 09:09:34
원래의
1297명이 탐색했습니다.

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

  1. // 参数设置
  2. $total=100;
  3. $min_num=1;
  4. $max_num=36;
  5. $times=5;
  6. $average=$total/$times;
  7. $now=0;
  8. for($i=0;$i{
  9. $off=0;
  10. $tmp=0;
  11. if($i==$times-1)
  12. {
  13. $tmp=$total-$now;
  14. if($tmp>$max_num||$tmp {
  15. $off=$now=0;
  16. $i=0;
  17. // echo "$tmp|";// 不符合要求的数据
  18. unset($num);
  19. $tmp=rand($min_num,$max_num);
  20. $off=$tmp-$average;
  21. $now=$now+$tmp;
  22. $num[]=$tmp;
  23. continue;
  24. }
  25. else
  26. {
  27. $num[]=$tmp;
  28. break;
  29. }
  30. }
  31. if($off==0)
  32. {
  33. $tmp=rand($min_num,$max_num);
  34. }
  35. else
  36. {
  37. $tmp=rand($min_num-$off,$max_num-$off);
  38. $tmp=($tmp+$off);
  39. }
  40. $off=$tmp-$average;
  41. $now=$now+$tmp;
  42. $num[]=$tmp;
  43. }
  44. // 测试
  45. $con='';
  46. foreach($num as $val)
  47. {
  48. $total_my=$total_my+$val;
  49. echo $con."$val";
  50. $con="+";
  51. }
  52. echo '='.$total_my;
  53. exit;
  54. ?>
复制代码


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!