c# - 有偏见的元素生成算法

标签 c# algorithm data-structures real-time

在我的游戏中,我想生成 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/

相关文章:

c# - 检测 JIT 是否可用

php - 如何为图像创建隐藏水印以(至少)调整大小

algorithm - 生成具有最高多样性的 RGB 颜色集

c++ - c++ if语句中的多个条件(通过链表的堆栈实现)

c# - 用字符串拆分字符串时出错

c# - 触发事件 WPF 的计时器

c# - 当异步方法在线程上使用时间时,这意味着什么?

algorithm - 将增量对转换为度数

java - Java中如何连接LinkedList?

java - 程序执行时间|将值保存到文件或数据结构中?