【发布时间】:2010-11-06 00:17:29
【问题描述】:
什么是用于 C++ 游戏的好的随机数生成器?
我的考虑是:
- 需要大量随机数,所以速度不错。
- 玩家总是会抱怨随机数,但我希望能够向他们指出一个参考资料,说明我确实做了我的工作。
- 由于这是一个我没有太多时间的商业项目,如果算法 a) 相对容易实现或 b) 具有良好的非 GPL 实现,那就太好了。
- 我已经在很多地方使用了
rand(),因此任何其他生成器最好能够证明它需要进行的所有更改。
我对这个主题了解不多,所以我能想到的唯一选择是Mersenne Twister;它满足所有这些要求吗?还有什么更好的吗?
编辑: Mersenne Twister 似乎是共识选择。但是第 4 点呢?真的比rand()好很多吗?
编辑 2:让我对第 2 点更清楚一点:玩家无法通过知道随机数来作弊。时期。我希望它足够随机,以至于人们(至少是那些理解随机性的人)不能抱怨它,但我并不担心预测。 这就是为什么我将速度作为首要考虑因素。
编辑 3:我现在倾向于 Marsaglia RNG,但我仍然希望获得更多信息。因此,我设置了赏金。
编辑 4: 请注意:我打算在今天 UTC 午夜之前接受一个答案(以避免弄乱某人的代表上限)。因此,如果您正在考虑回答,请不要等到最后一分钟!
另外,我喜欢 Marsaglia 的 XORshift 生成器的外观。有人对他们有意见吗?
【问题讨论】:
-
这在一定程度上取决于您希望随机数具有什么配置文件;你想让它们均匀分布吗?高斯?离散的还是连续的?
-
Stobor,你可以很好地从均匀随机数生成其他分布。
-
是的,我知道您可以将任何类型转换为任何其他类型,但如果您知道您主要在离散二元决策(真/假、左/右等)中使用随机变量,那么您可以通过使用二进制生成器而不是使用整数 1 并每次计算 (x > RAND_MAX/2) 来提高速度。
-
我希望有一个替代 rand() 的替代品(尤其是所有那些“rand() % 10”行),所以我更喜欢均匀分布和离散的。
-
我以前用过这个类,超级好用。 A Mersenne Twister Class是由梅森Twister算法的发明者的原始C代码创建的一个类。
标签: c++ performance random