もともと、友人が私に 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 をランダムに見つけて、それが要件を満たしているかどうかを判断するだけで済みます。 もっと良い方法がある場合は、スレッドで教えてください。ありがとうございます!
//パラメータ設定- $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;
- ブレーク;
- }
- }
- 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;
- ?>
-
コードをコピー
|