【问题标题】:Probability Based on Increasing Distance in PHPPHP中基于距离增加的概率
【发布时间】:2012-12-17 14:25:41
【问题描述】:

我正在尝试根据概率从数据集中进行随机选择,该概率由游戏 PHP 中映射点之间的距离量决定。此外,数据集中包含的潜在记录也是由距离决定的。

我有一张等级从 1 到 20 的怪物表。我希望能够首先根据用户是否已经移动足够的距离来选择怪物。

示例 1:

  • 如果距离在 1 - 100 之间,则只能包含 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);

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

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

【问题讨论】:

  • 距离是否仅以整数步长递增?
  • 不完全是。它是增量的,但我已经构建了一个六边形地图,其距离取决于一个人通过地图的方式。对角线的一个图块距离 54 像素。相邻的 1 个图块相距 69 像素,依此类推。但是字符从地图上的随机位置开始,所以我不能假设起点总是 0,0 (x&y)。这就是为什么我要对距离进行分组以确定怪物等级(例如 0-69 = 怪物等级 1、2、3' 69-154 = 等级 1、2、3、4、5、6 等等)。仍然按实际距离衡量怪物等级。

标签: php random distance probability


【解决方案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。当然,您可以更改数组中的数字来构建您喜欢的任何概率分布。

为了在我们的程序中使用这些数组,我们将它们转换为二维数组:

$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])

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

【讨论】:

  • 好的,让我玩这个,看看我能想出什么。谢谢。
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2014-06-21
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多