1

私がやりたいことは、数 ( $row['count']) を 5 に分割することです。等しい数が必要な場合、これは簡単です。

$sum  = ($row['count'] / 5);
$fsum = floor($sum);

しかし、私は各数値が異なっていて、それでも合計になることを望んでいます。つまり$row['count']、これをどのように達成できますか?

アップデート:

これがデータベース内の 5 つの行を更新するために使用されるのに役立つ場合:

$query  = "SELECT * FROM foo";
$result = mysql_query($query);

while ($row = mysql_fetch_array($result)) {

    $sum  = ($row['count'] / 5);
    $fsum = floor($sum);
    $id   = $row['id'];

    $update = "UPDATE foo SET foo1='$fsum', foo2='$fsum', foo3='$fsum', foo4='$fsum', foo5='$fsum' WHERE id='$id'";

    mysql_query($update);

    }// while

理想的には、$updateクエリは次のようになります。

$update = "UPDATE foo SET foo1='$fsum1', foo2='$fsum2', foo3='$fsum3', foo4='$fsum4', foo5='$fsum5' WHERE id='$id'";
4

1 に答える 1

2

これは私の見解です:

function randomize($sum, $parts) {
    $part_no = count($parts);
    $continnue_counter = 0;

    while (count(array_unique($parts)) != $part_no) {
        $changing = array_rand($parts, 2);
        if (($parts[$changing[0]] - 1) == 0 || ($parts[$changing[1]] - 1) == 0) { // don't let them go under 1
            ++$continnue_counter;

            // sometime one element get everything and others even out on 1
            // just throw away everything you got so far and start over
            if ($continnue_counter > 10) {
                $parts = setup($sum, $part_no);
                $continnue_counter = 0;
            }
            continue;
        }
        $continnue_counter = 0;

        $signum   = mt_rand(0, 100) % 2 ? 1 : -1;
        $delta    = $signum * mt_rand(1, min($parts[$changing[0]] - 1, $parts[$changing[1]] - 1)); // -1 to make sure they don't go under 0
        $parts[$changing[0]] += $delta;
        $parts[$changing[1]] -= $delta;
    }
    return $parts;
}

function setup($sum, $part_no) {
    $parts = array_fill(0, $part_no, (int)($sum / $part_no));

    // acount for the reminder of (int) cast
    $reminder = $sum - array_sum($parts);
    while ($reminder) {
        $parts[array_rand($parts)] += 1;
        --$reminder;
    }

    return $parts;
}

$part_no = 5;
$sum = 42;

$parts = randomize($sum, setup($sum, $part_no));

var_export($parts);
print array_sum($parts)

アップデート:

もう少しエントロピーを導入したバージョンを追加しました。

更新 2:

よりランダムなものは、一部を除いてすべてを 1 に減らす傾向があり、これに対処するための明示的な検出を追加しました。その背後にあるアルゴリズムの終了時間はまだ不明です。

于 2012-08-17T17:03:50.500 に答える