【问题标题】:Can I use a random generator without specifying a number distribution?我可以在不指定数字分布的情况下使用随机生成器吗?
【发布时间】:2019-08-14 12:17:24
【问题描述】:

我正在开发一款手机游戏,我需要创造一种以完全相同的方式玩同一关卡的可能性。这听起来很简单,因为我知道随机生成器的种子,为此目的应该是相同的。

这个问题后来出现了,当我在许多教程中使用std::mt19937std::uniform_int_distribution 时。正如在另一个问题here 中注意到的那样,平台之间的随机数分布并不一致,而引擎是一致的(如果它基于数学算法,它怎么可能不同?)。

我没有太注意这个问题,只是使用了std::mt19937,没有分发。

如果对号码分布没有特殊要求,是不是正确的使用方式?

【问题讨论】:

  • 您始终可以编写自己的发行版,或从头开始编写整个伪随机生成器,这将在您的平台上保持一致。对于像手机游戏这样毫无意义的东西,我怀疑伪随机数生成的数学质量是否非常重要。
  • @SamVarshavchik 谢谢,我同意你的观点,即需要数字范围不大的手机游戏不需要高数学质量。
  • 相关/可能是骗子:stackoverflow.com/q/38367976/4342498

标签: c++ c++11 random cross-platform


【解决方案1】:

std::mt19937 产生 [0, 232-1] 范围内的均匀随机数。它实现了Mersenne Twister 算法,并保证提供跨实现的可重现结果。

如果您需要不同的范围,则需要以某种方式将 [0, 232-1] 减少到您想要的范围。 std::uniform_int_distribution 是一个方便的工具(但不能保证跨实现的可移植性)。

【讨论】:

  • @rustyx;你必须非常富有。
【解决方案2】:

随机数生成器 std::mt19937 将为任何平台生成相同的值,但可惜标准允许std::uniform_int_distribution 灵活。

所以你需要自己进行转换。

【讨论】:

猜你喜欢
  • 2012-05-26
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多