我可以在不指定数字分布的情况下使用随机生成器吗?

时间:2019-08-14 12:17:24

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

我正在开发手机游戏,所以我需要创造一种可能性,以绝对相同的方式玩同样的游戏。这听起来很容易,因为我知道随机生成器的种子,为此它应该是相同的。

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

我在这个问题上没有特别注意,只是使用std::mt19937而没有分发。

如果对号码分配没有特殊要求,这是一种正确的用法吗?

2 个答案:

答案 0 :(得分:6)

std::mt19937产生范围为[0,2 32 -1]的统一随机数。它实现了Mersenne Twister算法,并保证在所有实现中都提供可重复的结果。

如果需要其他范围,则需要以某种方式将[0,2 32 -1]减小到所需范围。 std::uniform_int_distribution是实现此目的的便捷工具(但不能保证实现之间的可移植性)。

答案 1 :(得分:4)

随机数生成器 std::mt19937将在任何平台上生成相同的值,但是标准允许std::uniform_int_distribution具有灵活性。

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