Maison >développement back-end >C++ >Comment puis-je générer de manière fiable mt19937 en C pour une génération de nombres aléatoires de haute qualité ?

Comment puis-je générer de manière fiable mt19937 en C pour une génération de nombres aléatoires de haute qualité ?

DDD
DDDoriginal
2024-11-29 13:36:25376parcourir

How Can I Reliably Seed mt19937 in C   for High-Quality Random Number Generation?

Résoudre les problèmes d'amorçage PRNG en C

Malgré l'utilisation généralisée de pour la génération de nombres aléatoires, l'approche s'appuie souvent sur std::random_device, qui souffre de plusieurs limitations. Reconnaissant ces problèmes, cette discussion explore comment amorcer le PRNG mt19937 de manière complète, portable et succincte.

Évitez de vous fier uniquement à std::random_device et time(NULL)

L'utilisation de std::random_device ou time(NULL) seul est insuffisante pour l'amorçage mt19937 en raison d'une faible entropie et d'une distribution non uniforme.

Solution : utiliser un wrapper CSPRNG

Une solution minimale consiste à utiliser un wrapper autour d'un CSPRNG, tel que sysrandom défini ci-dessous. Ce wrapper donne accès à des octets aléatoires de qualité cryptographique :

size_t sysrandom(void* dst, size_t dstlen);

Implémentations spécifiques à la plate-forme

Pour Windows, nous pouvons utiliser CryptGenRandom :

size_t sysrandom(void* dst, size_t dstlen)
{
    HCRYPTPROV ctx;
    ... // Acquire and release cryptographic context
    CryptGenRandom(ctx, dstlen, dst);
    return dstlen;
}

Sur les systèmes de type Unix, nous pouvons employer /dev/urandom :

size_t sysrandom(void* dst, size_t dstlen)
{
    std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in);
    stream.read(dst, dstlen);
    return dstlen;
}

Amorçage de mt19937

En utilisant le wrapper sysrandom, nous pouvons amorcer mt19937 avec suffisamment de bits :

std::uint_least32_t seed;
sysrandom(&seed, sizeof(seed));
std::mt19937 gen(seed);

Comparaison avec Boost

Cette approche est parallèle à boost::random_device, qui utilise des CSPRNG sécurisés sur diverses plates-formes.

Considérations supplémentaires

Sous Linux, getrandom fournit une alternative plus sécurisée à /dev/urandom. OpenBSD n'a pas /dev/urandom ; utilisez plutôt getentropy.

Conclusion

Cet article fournit un guide complet pour amorcer efficacement le PRNG mt19937, garantissant une génération de nombres aléatoires de haute qualité 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn