创建带有权重修饰符的加权随机系统



我正在尝试使用c#在unity中为我的游戏创建一个加权随机系统。

玩家一开始有N个事件,但随着游戏的进行,事件的数量会增加。一开始,所有事件的概率都是相等的,概率是1/N,但玩家可以使用修改器使某些事件更有可能发生,比如有些事件发生的概率是两倍,或者在某些情况下,他们可以强迫事件发生。

我发现,做加权随机的普遍方法是将所有权重相加,生成随机数,直到权重之和,然后迭代选择并累积权重,直到累加器>生成价值。

现在我可能想得太多了,但对我来说,这种方法似乎有一些问题。

例如:玩家有7个选择,每个选择的权重为1/7,权重之和为1。现在,如果一个事件有两个修饰符它的新概率是2/7,权重之和为8/7。这让我想到,我应该从其他事件的权重中减去1/42,以保持总和为1。否则,我认为它实际上不是双倍概率。

另一个例子:玩家强迫事件100%发生。这意味着一个事件的权重为1,所有其他事件的权重为0。现在它取决于随机函数的实现,但理论上没有什么能阻止随机输出0,然后根据事件的顺序,任何带有0的事件都可能发生。

如果你注意到我把权重保持在0到1之间。这允许我交替使用权重和概率,因为1/7的权重也意味着1/7的概率。此外,这样我就不必计算权重的总和,因为它总是1。

这个问题是不是我想太多了,它实际上并没有那么复杂?额外的注意:有些人可能会建议根据从大到小的权重对事件列表进行排序。由于RNG系统是游戏玩法的核心,并且经常发生,所以从性能的角度来看,对事件进行排序可能不明智,因为每次抽出一个新的随机事件时,可能会有不同的修饰符。

同样,如果在7个选择的例子中,当我将1个事件的概率加倍,而不是2/7,我将使用2/8,其他所有事件都是1/8,那么它实际上不是2/7的概率加倍>2/8。

试试:https://github.com/cdanek/kaimira-weighted-list

免责声明:这是我写的,但这正是你要找的。

get操作不需要多次点击列表。该解决方案从O(1)的加权列表中获得结果。它也(希望)非常容易实现。

最新更新