在我的游戏中,我想生成 N 个元素,不一定同时生成。有些元素取决于之前生成的东西(马尔可夫链式),因此连续生成两个火箭发射器的概率很低,但有一个合理的概率生成一个火箭发射器,然后是火箭。这样做最有效的方法是什么?该方法将被经常调用,因此我试图将计算量保持在最低限度。
我想出的一个想法可能是创建一个 N x N 数组,它充当概率的查找表(Item previously spawned VS Item to spawn)。但是,在这个过程中,我需要某种方法来生成随机数,并将概率作为偏差。我不确定最好的方法是什么。当库存开始发挥作用时,事情也会变得有些棘手,因为如果 Y 数量已经产生,则无法产生火箭。我可以创建一个 3D 数组并将库存编号存储在其中,但我不确定根据库存不断更新数组查找表的效率如何。
这只是我提出的一个想法,但可能还有另一种更好的方法。有没有比 3D 数组更有效的数据结构,或者我应该阅读的算法?
最佳答案
如果不需要存储太多状态,最有效的方法就是按照您的提示进行操作:创建马尔可夫链。与每个状态相关联的是一组退出到下一个状态的概率。这使您可以完全控制该过程并且非常紧凑。 (请注意,您通过生成一个从 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 之间的值)你会发现你得到多余的发射器获得更多的可能性会下降。但是,与此同时,你会增加获得火箭的机会。基本上,如果您最近有一个发射器,您将有一些呈指数衰减的权重因子,这会使您对发射器产生偏见。
关于c# - 有偏见的元素生成算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451861/