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
362 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!

source:php.cn
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