Comment amorcer soigneusement le PRNG MT19937 en C
Généralement, std::random_device est utilisé pour générer des nombres aléatoires, comme le montre le code suivant :
std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen);
Cependant, cette méthode est imparfaite parce que :
Une approche plus fiable consiste à utiliser un CSPRNG, tel que CryptGenRandom sur Windows ou /dev/urandom sur les systèmes de type Unix, pour générer des octets aléatoires de haute qualité pour amorcer le PRNG. Par exemple :
#include <bit> #include <iostream> #include <string> size_t sysrandom(void* dst, size_t dstlen) { std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in); stream.read((char*)dst, dstlen); return dstlen; } int main() { std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed); // Your code to use the generator here... return 0; }
Ce code utilise /dev/urandom comme CSPRNG et amorce le PRNG en utilisant une valeur de 32 bits, qui devrait être augmentée pour une meilleure sécurité. Cette approche est portable, bien testée et facile à utiliser, fournissant une base solide pour générer des nombres aléatoires en C .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!