根据概率分布得到结果

时间:2012-06-06 12:57:16

标签: php math

在浏览器游戏中,我们有根据其概率发生的项目。

P(i1)= 0.8

P(i2)= 0.45

P(i3)= 0.33

P(i4)= 0.01

我们如何在php中实现一个基于概率机会返回随机项的函数?

修改

这些项目有一个名为rarity的属性,从1到100不等,表示发生概率。发生的项目是从特定类型的所有项目的集合中选择的。 (例如,上面给出的示例表示所有工件第1层)

2 个答案:

答案 0 :(得分:7)

我不知道它是否是最好的解决方案,但是当我不得不解决这个问题时,这就是我发现的:

取自this blog post的功能:

// Given an array of values, and weights for those values (any positive int) 
// it will select a value randomly as often as the given weight allows. 
// for example:
// values(A, B, C, D)
// weights(30, 50, 100, 25)
// Given these values C should come out twice as often as B, and 4 times as often as D. 
function weighted_random($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]; 
}

示例电话:

$values = array('A','B','C');
$weights = array(1,50,100);

$weighted_value = weighted_random($values, $weights);

显然需要单独提供值和重量,这有点笨拙,但这可能会被重构以满足您的需求。

答案 1 :(得分:0)

试图了解Bulk的功能是如何运作的,以下是基于Benjamin Kloster的回答:

https://softwareengineering.stackexchange.com/questions/150616/return-random-list-item-by-its-weight

生成0到总和(权重)范围内的随机数n,在这种情况下为$ num,因此可以说:权重(30,50,100,25)。

总和是205。

现在$ num必须是0到30才能得到A,

30-80得到B

80-180得到C

和180-205得到D

while循环找到$ num落在哪个区间。