【问题标题】:Weighted Random Choice In PHPPHP中的加权随机选择
【发布时间】:2020-01-22 01:23:49
【问题描述】:

我需要帮助以使我的概率赔率更接近低百分比的测试结果。我所拥有的似乎适用于 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]; 
}

【问题讨论】:

    标签: php random probability probability-density weighted


    【解决方案1】:

    mt_rand 返回一个整数,因此将其与 0.02 进行比较实际上与将其与 1 进行比较相同。因此,对于小于 1% 的权重,您总是得到大约 1%。尝试像这样计算$num

    $num = mt_rand(0, array_sum($weights) * 100) / 100; 
    

    Demo on 3v4l.org

    【讨论】:

    • @Danny 不用担心。我很高兴能帮上忙。
    猜你喜欢
    • 2015-07-05
    • 2010-09-08
    • 2023-03-31
    • 2017-12-26
    • 2010-09-08
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多