1

私は正常に動作するPHPの次のコードを持っています(実行するたびに多かれ少なかれ10の結果を返します):

function GetAboutTenRandomNumbers()
{
    $result = array();

    for ($i = 0; $i < 240; $i++)
    {
        if (Chance(10, 240) === true)
        {
            $result[] = $i;
        }
    }

    echo '<pre>';
    print_r($result);
    echo '</pre>';

    return $result;
}

そして、Chance()関数は次のようになります。

function Chance($chance, $universe = 100)
{
    $chance = abs(intval($chance));
    $universe = abs(intval($universe));

    if (mt_rand(1, $universe) <= $chance)
    {
        return true;
    }

    return false;
}

ここで、これらの10個の(平均)結果を次の4つのセグメントにランダムに分割します。

  1. 10%* 10=1の確率を持つ最初のもの
  2. 20%* 10=2の確率を持つ2番目のもの
  3. 30%* 10=3の確率を持つ3番目のもの
  4. 40%* 10=4の確率を持つ4番目のもの

ご覧のとおり、すべてのセグメントの合計(1 + 2 + 3 + 4)は10に等しいので、これを行うために次の関数をコーディングしました。

function GetAboutTenWeightedRandomNumbers()
{
    $result = array();

    // Chance * 10%
    for ($i = 0; $i < 60; $i++)
    {
        if (Chance(10 * 0.1, 240) === true)
        {
            $result[] = $i;
        }
    }

    // Chance * 20%
    for ($i = 60; $i < 120; $i++)
    {
        if (Chance(10 * 0.2, 240) === true)
        {
            $result[] = $i;
        }
    }

    // Chance * 30%
    for ($i = 120; $i < 180; $i++)
    {
        if (Chance(10 * 0.3, 240) === true)
        {
            $result[] = $i;
        }
    }

    // Chance * 40%
    for ($i = 180; $i < 240; $i++)
    {
        if (Chance(10 * 0.4, 240) === true)
        {
            $result[] = $i;
        }
    }

    echo '<pre>';
    print_r($result);
    echo '</pre>';

    return $result;
}

問題は、GetAboutTenWeightedRandomNumbers関数を数十回実行した結果が、GetAboutTenRandomNumbers関数によって返される結果よりもはるかに低いことです。私は根本的な数学の間違いを犯していると確信しています。どこにあるのか疑っていますが、それを解決する方法がわかりません。

4

2 に答える 2

3

確かにそうです!

2 番目のパスでは、パスごとに 240 ではなく 60 の値を与えるため、そのパスで期待される値の約 4 分の 1 を取得します。each を 240 まで実行し、モジュロ 60 を使用して、各ループで探している値の範囲を取得します。

于 2009-05-11T03:20:54.740 に答える
2

DoIt_02()とほぼ同じ数の結果が返されることを期待している場合DoIt_01()は、基本的な数学の間違いを犯しています。セクションの確率の重みの合計が 10 になることは意味がありません。0..59、60..119 などではなく、0..240 でそれぞれの制限された確率を実行すると、同様の結果が返されます。

ちなみに、あなたの関数は、あなたがしようとしているように見える確率を得るために、またはのいずれかChance()でなければならないという点で少しずれています。mt_rand(1, $universe) <= $chancemt_rand(0, $universe - 1) < $chance

于 2009-05-11T03:18:19.893 に答える