2

データベース テーブルに 200 を超えるエントリがあり、各エントリに対してランダムな値を生成したいのですが、最終的にエントリ値の合計は 100 に等しくなければなりません。 for ループと rand( を使用してこれを行うことは可能ですか? )PHPで?

4

5 に答える 5

3

次のように、一連の数値を単純に正規化できます。

$numbers = array();
for ($i = 0; $i < 200; $i += 1) {
  $numbers[] = rand();
}

$sum = array_sum($numbers);

// divide $sum by the target sum, to have an instant result, e.g.:
// $sum = array_sum($numbers) / 100;
// $sum = array_sum($numbers) / 42;
// ...

$numbers = array_map(function ($n) use($sum) {
  return $n / $sum;
}, $numbers);

print_r($numbers);
print_r(array_sum($numbers)); // ~ 1

デモ: http://codepad.viper-7.com/RDOIvX

于 2013-06-03T20:34:40.603 に答える
1

少し上/下にします:

$size = 200;
$sum = 100;
$places = 3;

$base = round($sum/$size, $places);

$values = array_fill(0, $size, $base);

for($i=0; $i<$size; $i+=2) {
    $diff = round((rand()/getrandmax()) * $base, $places);
    $values[$i]   += $diff;
    $values[$i+1] -= $diff;
}

//optional: array_shuffle($values);

$sum = 0;

foreach($values as $item) {
    printf("%0.3f ", $item);
    $sum += $item;
}

echo $sum;

出力:

0.650 0.350 0.649 0.351 0.911 0.089 0.678 0.322 0.566 0.434 0.563 0.437 0.933 0.067 0.505 0.495 0.503 0.497 0.752 0.248 0.957 0.043 0.856 0.144 0.977 0.023 0.863 0.137 0.766 0.234 0.653 0.347 0.770 0.230 0.888 0.112 0.637 0.363 0.716 0.284 0.891 0.109 0.549 0.451 0.629 0.371 0.501 0.499 0.652 0.348 0.729 0.271 0.957 0.043 0.769 0.231 0.767 0.233 0.513 0.487 0.647 0.353 0.612 0.388 0.509 0.491 0.925 0.075 0.797 0.203 0.799 0.201 0.588 0.412 0.788 0.212 0.693 0.307 0.688 0.312 0.847 0.153 0.903 0.097 0.843 0.157 0.801 0.199 0.538 0.462 0.954 0.046 0.541 0.459 0.893 0.107 0.592 0.408 0.913 0.087 0.711 0.289 0.679 0.321 0.816 0.184 0.781 0.219 0.632 0.368 0.839 0.161 0.568 0.432 0.914 0.086 0.991 0.009 0.979 0.021 0.666 0.334 0.678 0.322 0.705 0.295 0.683 0.317 0.869 0.131 0.837 0.163 0.792 0.208 0.618 0.382 0.606 0.394 0.574 0.426 0.927 0.073 0.661 0.339 0.986 0.014 0.759 0.241 0.547 0.453 0.804 0.196 0.681 0.319 0.960 0.040 0.708 0.292 0.558 0.442 0.605 0.395 0.986 0.014 0.621 0.379 0.992 0.008 0.622 0.378 0.937 0.063 0.884 0.116 0.840 0.160 0.607 0.393 0.765 0.235 0.632 0.368 0.898 0.102 0.946 0.054 0.794 0.206 0.561 0.439 0.801 0.199 0.770 0.230 0.843 0.157 0.681 0.319 0.794 0.206 100

100 や 200 などの適切な数値を使用していない場合、丸めは少し厄介になりますが、0.1 を超えることはありません。

于 2013-06-03T22:50:08.443 に答える