跨平台可重现的数字生成器

5
我需要一个“随机”数生成器,它可以在Windows、Mac、Linux、iOS和Android上对于给定的种子产生相同的结果。我尝试了std::randboost::random_int_generatorboost::mt19937,但遗憾的是在Windows和Mac之间的结果是不同的。
是否有人知道一个(C ++)实现,在所有平台上都能可靠地工作?
编辑1: 更具体地说,boost::mt19937在Windows和Mac上的数字之间存在差异,其中在Windows上生成了(2)个额外的数字块。这看起来非常奇怪,因为这些块只出现在Windows中,其余的大部分数字都是相同的。
编辑2: boost::mt19937在所有平台上都可以可靠地工作。我们的问题并不是因为那里有错误。

1
Mersenne Twister 怎么样? - transistor09
4
boost::mt19937应该提供一致的结果,你能否提供一个最小完整可验证示例 - Shafik Yaghmour
@ShafikYaghmour 很遗憾还没有。请查看编辑部分以获取更好的问题描述。稍后我会尝试创建一个小例子。 - abergmeier
3个回答

4
如果您不需要太高质量的随机数生成器,您可以根据此处的描述自己实现一个一行代码的随机数生成器:https://en.wikipedia.org/wiki/Linear_congruential_generator 最近线性同余生成器名声很差,但对于许多实际目的来说它们还是可以的。
只要您小心地使用仅保证大小的类型(uint32_t等),在所有平台上都应该没问题。
如果您需要更好质量的随机数生成器,再次,您可以自己实现Mersenne Twister (https://en.wikipedia.org/wiki/Mersenne_Twister),但它会更加复杂。
另一种方法是使用AES(或任何其他块密码,例如Chacha20)以CTR模式(使用一些预定义的密钥)作为您的伪随机数发生器;它将是最好已知的(加密)质量:-)。这不会占用您过多编码时间,但您需要链接AES实现(它们广泛可用)。
编辑:示例伪代码以说明基于密码学的PRNG:
class CryptoBasedPRNG {

 uint128_t key;
 uint128_t count;

 CryptoBasedPRNG(whatever-type seed) {
   //derive key and initial counter from seed
   //  we'll be using SHA256, but any other split should do (like odd bits/even bits of seed)
   uint256_t sha = sha256(seed);
   key = low_128bits(sha);
   count = high_128bits(sha);
  }

  uint128_t random_128_bits() {
    count += 1;//with wraparound
    return aes128(key,count);//encrypting 'count' as input data for aes128 (in ECB mode, if anybody asks about mode at this point)
  }
}

相当简单且非常随机。

1
boost::mt19937 不就是 Mersenne Twister 的实现吗? - abergmeier
1
@abergmeier:是的,但OP说它在Mac和Windows上产生不同的结果 :-(。 - No-Bugs Hare

3

这个问题涉及跨平台数字生成,但我在您提供的链接页面中没有看到相关内容。 - unlut
@unlut 嗯,PCG-Random 被认为是跨平台可重现的高质量随机数生成器。 - Severin Pappadeux
我看到它确实是这样的(至少对于整数),在检查后,但是这在文档中有说明吗?我认为我应该在不查看库的内部情况下获得这些信息。 - unlut
@unlut 嗯,这里有一篇论文 https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf 描述了相关特性。NumPy 将 PCG XSL RR 128/64 (LCG) 作为默认的随机数生成器。 - Severin Pappadeux

2
不同的数字导致我们使用了一段glm代码。这些数字使用了未确定的参数排序,这对于几乎随机的目的来说很好,但是当你想要确定性数字时就不行了(显然)。因此,我们为了我们的目的纠正了代码,并成功地在Windows、Mac、Linux、Android和iOS上使用了boost::mt19937。对于造成的困惑我们感到抱歉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接