高品質のRNGが必要ない場合は、ここの説明に従ってワンライナーとして自分で実装できます: https://en.wikipedia.org/wiki/Linear_congruential_generator、しかし多くの実用的な目的では問題ありません。
保証されたサイズの型 (uint32_t など) のみを使用することに注意している限り、すべてのプラットフォームで問題ないはずです。
より高品質の RNG が必要な場合は、Mersenne Twister ( https://en.wikipedia.org/wiki/Mersenne_Twister ) を自分で実装することもできますが、より複雑になります。
さらに別の方法は、PRNG として 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)
}
}
かなり簡単で非常にランダムです。