n 個の数値の合計は 32898 または他の整数であることが知られています。
各加数を求め、結果はランダムである必要があります。
加数は 1 (両端を含む) から 999 (両端を含む) までの整数です
つまり $arr[1]+$arr[2]+....+$arr[n]=32898
は次のようにする必要がありますこれら 33 個の加数を見つけるには、これら 33 個の加数の配列を返す必要があります。結果はランダムである必要があります。
私の実際のアプリケーションでは、各加数は 1 ~ 999 でなければなりません。専門家はこの範囲に従ってテストする必要があります。
function xxx(32898,33,1,999){ $arr = array(); return $arr;}
加数は繰り返すことができますか?
1 から 99 までの 33 個の数字は 32898 を形成します
平均は 997 です
したがって、値の範囲は 995 ~ 999 です
1 を選ぶことは不可能です。
$r = foo(32898, 33);echo array_sum($r), PHP_EOL; //验证总和print_r(array_count_values($r)); //查看分布function foo($num, $k, $min=1, $max=999) { $res = array_fill(0, $k, 1); do { for($i=0; $i<$k; $i++) { $sum = array_sum($res); $t = rand(0, $max - $min); if($res[$i] + $t > $max) $t = $max - $res[$i]; if($sum + $t > $num) $t = $num - $sum; $res[$i] += $t; } }while($num > $sum); return $res;}
32898Array( [999] => 31 [971] => 1 [958] => 1)
加法は繰り返すことができますか?
$r = foo(32898, 33);echo array_sum($r), PHP_EOL; //验证总和print_r(array_count_values($r)); //查看分布function foo($num, $k, $min=1, $max=999) { $res = array_fill(0, $k, 1); do { for($i=0; $i<$k; $i++) { $sum = array_sum($res); $t = rand(0, $max - $min); if($res[$i] + $t > $max) $t = $max - $res[$i]; if($sum + $t > $num) $t = $num - $sum; $res[$i] += $t; } }while($num > $sum); return $res;}
32898Array( [999] => 31 [971] => 1 [958] => 1)
$r = foo(32898, 33);echo array_sum($r), PHP_EOL; //验证总和print_r(array_count_values($r)); //查看分布function foo($num, $k, $min=1, $max=999) { $res = array_fill(0, $k, 1); do { for($i=0; $i<$k; $i++) { $sum = array_sum($res); $t = rand(0, $max - $min); if($res[$i] + $t > $max) $t = $max - $res[$i]; if($sum + $t > $num) $t = $num - $sum; $res[$i] += $t; } }while($num > $sum); return $res;}
32898Array( [999] => 31 [971] => 1 [958] => 1)
$r = foo(32898, 33);
$r はご希望の結果です。検証を行いました。それをどうするかはあなた自身の仕事です
$r は配列であり、print_r($r) は内容を表示します