c++ - 需要可预测的随机发生器

标签 c++ algorithm random

我是一名网络游戏开发人员,我遇到了随机数问题。假设一个玩家有 20% 的机会用他的剑造成致命一击。这意味着,五分之一的命中应该是关键的。问题是我在现实生活中得到了非常糟糕的结果——有时玩家在 5 次命中中得到 3 个暴击,有时在 15 次命中中没有。战斗时间很短(3-10 次命中),因此获得良好的随机分布很重要。

目前我使用 PHP mt_rand(),但我们只是将代码移动到 C++,所以我想在我们游戏的新引擎中解决这个问题。

我不知道解决方案是否是某种统一的随机生成器,或者可能要记住以前的随机状态以强制正确分布。

最佳答案

That means, 1 out of 5 hits should be critical. The problem is I got very bad real life results - sometimes players get 3 crits in 5 hits, sometimes none in 15 hits.

您需要的是 shuffle bag .它解决了真随机对于游戏来说太随机的问题。

算法大概是这样的:你把 1 个重击和 4 个非重击放在一个袋子里。然后你将它们在袋子里的顺序随机化,一次挑出一个。当袋子是空的时,你再次用相同的值填充它并随机化它。这样,您将平均每 5 次命中获得 1 次重击,并且连续最多 2 次重击和 8 次非重击。增加包中元素的数量以获得更多随机性。

这里是 an implementation 的示例(在 Java 中)和 its test cases我前段时间写的。

关于c++ - 需要可预测的随机发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/910215/

相关文章:

C++ Visual Studio 2010 LNK2019 错误 - 需要一些基本建议

c++ - 访问类QList指针的成员

c++ - SOCI 无法准备声明

算法 - 给定顶点约束的路径查找

python - 如何使用 numpy 对 Floyd-Steinberg 的抖动算法进行矢量化?

java - 如何避免覆盖java中的按钮文本?

java - 使用 java.time 生成一个随机的 LocalDate

c++ - OpenCL 仅读取/写入缓冲内存的 1/4,有时会崩溃

string - 求一个 n 位数字中能被 8 整除的子序列的个数

python - 随机数生成器的性能结果相互矛盾