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
Libérer: 2024-11-29 13:36:25
original
382 Les gens l'ont consulté

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);
Copier après la connexion

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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);
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal