如果你不需要太高质量的 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)
}
}
相当容易和非常随机。