ホームページ  >  記事  >  バックエンド開発  >  1 ~ 36 の 36 個の数字のうち、合計が 100 になるように 5 個をランダムに選択します。

1 ~ 36 の 36 個の数字のうち、合計が 100 になるように 5 個をランダムに選択します。

WBOY
WBOYオリジナル
2016-07-25 09:09:341346ブラウズ

もともと、友人が私に Excel でメソッドを書くのを手伝ってほしいと頼んだのです。1 から 36 までの 36 個の数字のうち 5 つをランダムに選択して、合計が 100 になるようにします。

Excelの使い方があまり得意ではないので、phpでメソッドを書いてみます

想像してみてください: 5 つの数字がすべて 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. $total=100;
  2. $min_num=1;
  3. $max_num=36;
  4. $times=5;
  5. $average=$total/$times;
  6. $ now=0;
  7. for($i=0;$i<$times;$i++)
  8. {
  9. $off=0;
  10. $tmp=0;
  11. if($i==$times-1)
  12. {
  13. $tmp=$total-$now;
  14. if($tmp>$max_num||$tmp<0)
  15. {
  16. $off=$now=0;
  17. $i=0;
  18. // echo "$tmp|" ;//要件を満たさないデータ
  19. unset($num);
  20. $tmp=rand($min_num,$max_num);
  21. $off=$tmp-$average;
  22. $now=$now+$tmp;
  23. $num []=$tmp;
  24. continue;
  25. }
  26. else
  27. {
  28. $num[]=$tmp;
  29. ブレーク;
  30. }
  31. }
  32. if($off==0)
  33. {
  34. $tmp=rand ($ min_num,$max_num);
  35. }
  36. else
  37. {
  38. $tmp=rand($min_num-$off,$max_num-$off);
  39. $tmp=($tmp+$off);
  40. }
  41. $off= $tmp -$average;
  42. $now=$now+$tmp;
  43. $num[]=$tmp;
  44. }
  45. // テスト
  46. $con='';
  47. foreach($num as $val)
  48. {
  49. $total_my =$total_my+$val;
  50. echo $con."$val";
  51. $con="+";
  52. }
  53. echo '='.$total_my;
  54. exit;
  55. ?>
コードをコピー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。