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]; 

}


明月笑刀无情
浏览 164回答 1
1回答

幕布斯6054654

mt_rand返回一个整数,因此将其与 0.02 进行比较实际上与将其与 1 进行比较是相同的。因此,对于小于 1% 的权重,您总是得到大约 1%。尝试$num像这样计算:$num&nbsp;=&nbsp;mt_rand(0,&nbsp;array_sum($weights)&nbsp;*&nbsp;100)&nbsp;/&nbsp;100;
打开App,查看更多内容
随时随地看视频慕课网APP