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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-07-25 09:09:341561ブラウズ

もともと、友人が私に 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{
  8. $off=0;
  9. $tmp=0;
  10. if($i==$times-1)
  11. {
  12. $tmp=$total-$now;
  13. if($tmp>$max_num||$tmp {
  14. $off=$now=0;
  15. $i=0;
  16. // echo "$tmp|" ;//要件を満たさないデータ
  17. unset($num);
  18. $tmp=rand($min_num,$max_num);
  19. $off=$tmp-$average;
  20. $now=$now+$tmp;
  21. $num []=$tmp;
  22. continue;
  23. }
  24. else
  25. {
  26. $num[]=$tmp;
  27. ブレーク;
  28. }
  29. }
  30. if($off==0)
  31. {
  32. $tmp=rand ($ min_num,$max_num);
  33. }
  34. else
  35. {
  36. $tmp=rand($min_num-$off,$max_num-$off);
  37. $tmp=($tmp+$off);
  38. }
  39. $off= $tmp -$average;
  40. $now=$now+$tmp;
  41. $num[]=$tmp;
  42. }
  43. // テスト
  44. $con='';
  45. foreach($num as $val)
  46. {
  47. $total_my =$total_my+$val;
  48. echo $con."$val";
  49. $con="+";
  50. }
  51. echo '='.$total_my;
  52. exit;
  53. ?>
コードをコピー

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