拆分概率

时间:2009-05-11 03:05:54

标签: language-agnostic random math probability

我在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;
}

现在,我想在以下4个段中随机分割这10个(平均)结果:

  1. 第一个概率为10%* 10 = 1
  2. 第二个概率为20%* 10 = 2
  3. 第三个概率为30%* 10 = 3
  4. 第四个概率为40%* 10 = 4
  5. 正如您所看到的,所有段的总和(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函数返回的结果要低得多。我确定我犯了一个基本的数学错误,我怀疑在哪里,但我不知道如何解决它。

2 个答案:

答案 0 :(得分:3)

确实你是!

在你的第二次传球中,每次传球给你60个值,而不是240,所以你将获得该传球中大约四分之一的预期值。将每个运行到240并使用模60来获得您在每个循环中寻找的值范围。

答案 1 :(得分:2)

如果您期望DoIt_02()返回与DoIt_01()相同数量的结果,那么是的,您正在犯一个基本的数学错误。你的部分的概率权重总和为10意味着什么,因为加权机会不适用于整个0..240集。如果你在0..240上运行每个受限概率而不是0..59,60..119等,它会返回类似的结果。

顺便提一下,您的Chance()功能略有偏差,为了获得您似乎尝试的概率,它应该是mt_rand(1, $universe) <= $chancemt_rand(0, $universe - 1) < $chance