我需要"随机"数字生成器,它为Windows,Mac,Linux,iOS和Android上的给定种子生成相同的结果。现在我尝试使用std::rand
boost::random_int_generator
和boost::mt19937
,但遗憾的是Windows和Mac之间的结果不同。
有没有人知道(C ++)实现,它在所有平台上都可靠地运行?
编辑1:
更具体地说,Windows和Mac上来自boost::mt19937
的数字之间的区别显示,在Windows上有(2)个额外的数字块生成。它看起来很奇怪,因为大多数数字是相同的,这些块只出现在Windows上。
编辑2:
boost::mt19937
可在所有平台上可靠运行。我们的问题不是那里的错误。
答案 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
。
很抱歉这个混乱。