基于PHP增长距离的概率

时间:2013-01-03 08:23:37

标签: php random distance probability

我正在尝试从基于概率的数据集中随机选择,该概率将由游戏中PHP的地图点之间的距离量决定。此外,数据集中包含的潜在记录也由距离确定。

我有一张水平表,水平从1到20.我希望能够先根据用户是否已经走了足够的距离来选择怪物。

示例1:

  • 如果距离介于1 - 100之间,则只能包含Monsters 1,2,3级
  • 距离越接近100,他们就越有可能获得更高等级的怪物(例如,如果你在距离100处,你最有可能获得3级怪物,不太可能得到一个2级甚至更不可能获得1级;如果你是距离50则最有可能获得2级并且同样可能获得1级或3级。

示例2:

  • 如果距离介于1 - 200之间,那么潜在的怪物等级为1,2,3,4,5,6
  • 与示例1相同的概率方法,但分布在更多的怪物级别和更多的潜在距离。

我找到了两篇让我思考正确方向的文章:

Get result based on probability distribution

php percentage chance


我可以根据距离轻松确定怪物分组。我可以从第1条中的函数中看到,例如,如果我知道怪物组中所有可能的距离,我可以像这样为它们分配权重:

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','D','E'); // Potential monster levels
$weights = array(1,20,50,75,100); // Possible distance ranges

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

问题是,我只知道该组最大潜在距离内的实际距离。换句话说,对于Monster Group 1(A,B,C,D,E),我知道玩家必须在1到100英里之间行进,我知道他们行进的距离(即85英里)。因此,我无法为其他怪物级别创建权重(或不知道如何)。

请注意,如果这个问题不够具体,请告诉我,我会继续思考解决方案并发布/更新。我希望有人至少可以给我一些关于方法的最佳实践想法,从那里我可以想出如何编写一些代码来完成。

1 个答案:

答案 0 :(得分:1)

一种方法是使用您发现的weighted_random函数,但方式不同。

构建对应于在不同距离找到怪物类的概率的数组:

$a=array(1,2,3,4,5,6,7,8,9,10);
$b=array(0,0,0,0,1,2,3,4,5, 6);
$c=array(0,0,0,0,0,0,0,1,2, 3);

这表示在距离0处,怪物等级A的概率为100%。同时,在距离9处,怪物等级A的概率为10/19,B为6/19,C为3/19。当然,您可以更改数组中的数字以构建您喜欢的任何概率分布。

要在我们的程序中使用这些数组,我们将它们转换为2D数组:

$probtable=array();
for($i=0;$i<count($a);$i++){
   $probtable[$i]=array($a[$i],$b[$i],$c[$i]);

现在,如果行进的距离为$d,那么$probtable[$d]会给出相应的怪物权重,并通过以下方式检索该类别:

weighted_random($values, $probtable[$d])

根据需要调整初始数组以使概率分布正确。