PHP 中的加权随机选择
Weighted Random Choice In PHP
我需要帮助使我的概率赔率更接近低百分比的测试结果。我所拥有的似乎适用于 1% 或更高的百分比,但我需要它适用于非常低的百分比,例如 0.02%(低至 4 位小数)。在 运行 一次测试 运行 1000-100000 次测试后,任何低于 1% 的概率最终都会达到 1% 左右,结果相似。
示例结果
ID Odds Test Total Test Odds
1 60.0000 301773 60.3546%
2 30.0000 148360 29.672%
3 9.9800 44897 8.9794%
4 0.0200 4970 0.994%
函数
// $values = [1,2,3,4]
// $weights = [60.0000,30.0000,9.9800,.0200]
private function getRandom($values, $weights)
{
$count = count($values);
$i = 0;
$n = 0;
$num = mt_rand(0, array_sum($weights));
while($i < $count)
{
$n += $weights[$i];
if($n >= $num)
break;
$i++;
}
return $values[$i];
}
mt_rand
returns 一个整数,所以将它与 0.02 进行比较实际上与将它与 1 进行比较是相同的。因此对于小于 1% 的权重,你总是得到大约 1%。尝试像这样计算 $num
:
$num = mt_rand(0, array_sum($weights) * 100) / 100;
我需要帮助使我的概率赔率更接近低百分比的测试结果。我所拥有的似乎适用于 1% 或更高的百分比,但我需要它适用于非常低的百分比,例如 0.02%(低至 4 位小数)。在 运行 一次测试 运行 1000-100000 次测试后,任何低于 1% 的概率最终都会达到 1% 左右,结果相似。
示例结果
ID Odds Test Total Test Odds
1 60.0000 301773 60.3546%
2 30.0000 148360 29.672%
3 9.9800 44897 8.9794%
4 0.0200 4970 0.994%
函数
// $values = [1,2,3,4]
// $weights = [60.0000,30.0000,9.9800,.0200]
private function getRandom($values, $weights)
{
$count = count($values);
$i = 0;
$n = 0;
$num = mt_rand(0, array_sum($weights));
while($i < $count)
{
$n += $weights[$i];
if($n >= $num)
break;
$i++;
}
return $values[$i];
}
mt_rand
returns 一个整数,所以将它与 0.02 进行比较实际上与将它与 1 进行比较是相同的。因此对于小于 1% 的权重,你总是得到大约 1%。尝试像这样计算 $num
:
$num = mt_rand(0, array_sum($weights) * 100) / 100;