>  기사  >  백엔드 개발  >  1~36 사이의 36개 숫자 중 무작위로 5개를 선택하여 합이 100이 되도록 합니다.

1~36 사이의 36개 숫자 중 무작위로 5개를 선택하여 합이 100이 되도록 합니다.

WBOY
WBOY원래의
2016-07-25 09:09:341335검색

本来是一个朋友让帮忙在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<$times;$i )
  9. {
  10. $off=0;
  11. $tmp=0;
  12. if($i==$times-1)
  13. {
  14. $tmp=$total-$now;
  15. if($tmp>$max_num||$tmp<0)
  16. {
  17. $off=$now=0;
  18. $i=0;
  19. // echo "$tmp|";// 不符合要求的数据
  20. unset($num);
  21. $tmp=rand($min_num,$max_num);
  22. $off=$tmp-$average;
  23. $now=$now $tmp;
  24. $num[]=$tmp;
  25. continue;
  26. }
  27. else
  28. {
  29. $num[]=$tmp;
  30. break;
  31. }
  32. }
  33. if($off==0)
  34. {
  35. $tmp=rand($min_num,$max_num);
  36. }
  37. else
  38. {
  39. $tmp=rand($min_num-$off,$max_num-$off);
  40. $tmp=($tmp $off);
  41. }
  42. $off=$tmp-$average;
  43. $now=$now $tmp;
  44. $num[]=$tmp;
  45. }
  46. // 测试
  47. $con='';
  48. foreach($num as $val)
  49. {
  50. $total_my=$total_my $val;
  51. echo $con."$val";
  52. $con=" ";
  53. }
  54. echo '='.$total_my;
  55. exit;
  56. ?>
复制代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.