Crossplatform可重现的数字生成器

时间:2015-06-04 16:33:14

标签: c++ random c++98 boost-random

我需要"随机"数字生成器,它为Windows,Mac,Linux,iOS和Android上的给定种子生成相同的结果。现在我尝试使用std::rand boost::random_int_generatorboost::mt19937,但遗憾的是Windows和Mac之间的结果不同。

有没有人知道(C ++)实现,它在所有平台上都可靠地运行?

编辑1:

更具体地说,Windows和Mac上来自boost::mt19937的数字之间的区别显示,在Windows上有(2)个额外的数字块生成。它看起来很奇怪,因为大多数数字是相同的,这些块只出现在Windows上。

编辑2:

boost::mt19937可在所有平台上可靠运行。我们的问题不是那里的错误。

3 个答案:

答案 0 :(得分:3)

如果你不需要太高质量的RNG,你可以根据这里的描述自己实现它作为单线:https://en.wikipedia.org/wiki/Linear_congruential_generator线性同余一族最近得到了一个很糟糕的名字,但对于许多实际的目的他们没事。

只要你小心使用保证大小的类型(uint32_t等),你应该在所有平台上都没问题。

如果您需要质量更好的RNG,您可以再次实施Mersenne Twister(https://en.wikipedia.org/wiki/Mersenne_Twister),但会更复杂。

另一种方法是在CTR模式下使用AES(或任何其他块密码,如Chacha20)(使用一些预定义的密钥)作为您的PRNG;它将是最着名的(加密)质量:-)。它不需要太多编码,但您需要链接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 :(得分:3)

你可能想从http://www.pcg-random.org/

尝试PCG-Random

体面,快速,便携

答案 2 :(得分:2)

不同的数字导致我们使用的static.war代码。他们使用未确定的参数评估顺序,这对于几乎随机的目的来说很好,但是当你想要确定性数字时(显然)。因此,我们针对我们的目的更正了代码,并在Windows,Mac,Linux,Android和iOS上成功使用STORE_DEF.war

很抱歉这个混乱。