我在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 + 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函数返回的结果要低得多。我确定我犯了一个基本的数学错误,我怀疑在哪里,但我不知道如何解决它。
答案 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) <= $chance
或mt_rand(0, $universe - 1) < $chance
。