偏差产生物品的算法

时间:2010-08-10 17:47:45

标签: c# algorithm data-structures real-time

在我的游戏中,我想生成N个项目,不一定是在同一时间。其中一些项目取决于之前产生的东西(马尔可夫链式),因此连续产生两个火箭发射器的概率很低,但产生火箭发射器的可能性很大,其次是火箭。这样做最有效的方法是什么?该方法将经常调用,所以我试图将计算保持在最低限度。

我想出的一个想法可能是创建一个N x N数组,它充当概率的查找表(项目先前生成的VS项目产生)。但是,在这个过程中,我需要一些生成随机数的方法,其概率可以作为偏差。我不确定这样做的最佳方式是什么。当库存发挥作用时,事情也会略微变得棘手,因为如果Y量已经产生,则无法生成火箭。我可以创建一个3D数组并将库存号存储在那里,但我不确定根据库存不断更新数组查找表的效率。

这只是我提出的一个想法,但可能还有另一种更好的方法。是否存在比3D阵列更有效的数据结构,或者我应该阅读的算法?

2 个答案:

答案 0 :(得分:4)

最有效的方法,如果你不需要存储很多状态,就是做你所暗示的:创建马尔可夫链。与每个州相关联的是一系列退出到下一个州的概率。这使您可以完全控制过程,并且非常紧凑。 (请注意,您可以通过生成0到1之间的随机数并对累积概率进行二进制搜索来使用它。)

另一种模糊的方法是维持一组概率和一组偏差。如果你有像

这样的偏见词
launcher_bias = 0.8*launcher_bias + 0.2*(1.0 - (last_item == launcher))
rocket_bias = 0.8*rocket_bias + 0.2*(last_item == launcher)

然后用这些值对概率进行加权(然后将整个集合重新规范化为1,或等效地,如果所有项目的总概率最终为0.7或者某些,你从0到0.7选择值)你会发现你得到多余的发射器,获得更多的可能性将下降。但是,与此同时,你将增加获得火箭的机会。基本上,如果你最近有一个加权因素,你会有一些指数衰减的加权因子会对发射器产生偏见。

答案 1 :(得分:3)

  

然而,在这个过程中,我需要   某种生成随机数的方法   概率充当偏见。   不知道最好的做法是什么   那是吗?

假设您有4个活动

  • 事件A,相对概率:4
  • 事件B,相对概率:1
  • 事件C,相对概率:1
  • 事件D,相对概率:10

相对概率之和为16,因此在[0,16]范围内生成随机数 X 。其中四个数字应映射到A,一个映射到B,等等。

  • X 中减去4。如果 X 现在为负数,请选择事件A。
  • 否则,从 X 中减去1。如果 X 现在为负数,请选择事件B。
  • 否则,从 X 中减去1。如果 X 现在为负数,请选择事件C。
  • 其他,选择事件D。