2010-08-10 60 views
3

在我的游戏中,我想产生N个项目,不一定在同一时间。其中一些项目依赖于之前产生的(马尔可夫链式),所以产生连续两个火箭发射器的概率很低,但产生火箭发射器和火箭的概率是合理的。什么是最有效的方法呢?这个方法会经常被调用,所以我试图尽量减少计算。产品偏倚产卵算法

我想出的一个想法可能是创建一个N×N数组,作为概率查找表(物品先前产生VS产生物品)。然而,在这个过程中,我需要一些方法来产生一个随机数,其中概率作为一个偏差。我不确定这样做的最佳方式是什么。如果库存发挥作用,事情也会略微变得更诡异,因为如果Y量已经产生,就不能生成火箭。我可以创建一个3D数组并将库存号存储在那里,但我不确定基于库存更新数组查找表的效率如何。

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

+0

这是一个有点一般..你尝试过什么?..如果我把所有的细节我敢肯定我可以写点东西,但截至目前我不知道该说些什么。 – Fosco 2010-08-10 17:53:32

+0

嗨,我还处于设计阶段,并试图首先理解它的理论。你有什么想让我进一步解释吗? – keyboardP 2010-08-10 17:56:30

+0

我很怀疑这个过程会成为瓶颈。首先,我会实现一些简单而不用担心效率问题。 – 2010-08-10 18:29:33

回答

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),你会发现,当你获得多余的发射器时,获得更多的概率将下降。但是,与此同时,你会增加获得火箭的机会。基本上,如果你最近有一个偏见,你会有一些指数衰减的权重因素,它会对发射器产生偏见。

+0

谢谢。我想我应该多读一些马尔可夫模型。通过对累积属性进行二分查找以使用链,您是什么意思? – keyboardP 2010-08-10 18:38:14

+1

假设您有五种不同结果的概率,依次为0.2,0.5,0.1,0.1,0.1。你将它转换为数组'0,0.2,0.7,0.8,0.9,1.0'。如果你从0到1选择一个随机数,那么你落在0和0.2之间的概率是0.2;在0.2和0.7之间是0.5,依此类推。选择一个随机数字并进行二分法搜索,查找您处于哪个范围内,从而选择哪个结果。如果你有超过六种不同的可能性,并且你需要快速做到这一点,它将比汤姆的方法更快。 (把汤姆的数字除以4 + 1 + 1 + 10得到概率....) – 2010-08-10 19:13:04

+0

啊,我现在明白了。谢谢您的帮助! – keyboardP 2010-08-10 19:16:48

3

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

假设有4个事件

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

相对概率之和为16,所以属在范围[0,16)内的随机数X。其中四个数字应该映射到A,一个映射到B,等等。

  • x减去4。如果X现在为负值,请选择事件A.
  • 否则,从X减去1 X。如果X现在为负,请选择事件B.
  • 否则,从X减去1 X。如果X现在是负的,挑选事件C.
  • 否则,选择事件D.
+0

谢谢,这是一个伟大的方法! – keyboardP 2010-08-10 18:33:19