Génération robuste de nombres aléatoires [fermé]
Question
Je recherche un RNG performant et raisonnablement robuste n'utilisant aucun matériel spécial.Il peut utiliser des méthodes mathématiques (Mersenne Twister, etc), il peut "collecter l'entropie" de la machine, peu importe.Sous Linux/etc, nous avons un drand48()
qui génère 48 bits aléatoires.J'aimerais une fonction/classe similaire pour C++ ou C# qui peut générer plus de 32 bits aléatoires et dont les bits de poids faible sont tout aussi aléatoires que les bits de poids fort.
Il n'est pas nécessaire qu'il soit sécurisé cryptographiquement, mais il ne doit pas utiliser ni être basé sur le langage C. rand()
ou .NET System.Random
.
Tout code source, liens vers la source, etc.serait apprécié!A défaut, quel TYPE de RNG dois-je rechercher ?
La solution
Pour le C++, Boost.Aléatoire c'est probablement ce que vous recherchez.Il prend en charge MT (parmi de nombreux autres algorithmes) et peut collecter l'entropie via le nondet_random
classe.Vérifiez-le!:-)
Autres conseils
La bibliothèque scientifique Gnu (GSL) dispose d'un ensemble assez complet de générateurs RN, de harnais de test, etc.Si vous êtes sous Linux, il est probablement déjà disponible sur votre système.
Méfiez-vous de la bibliothèque scientifique Gnu.Il est sous licence GPL plutôt que LGPL.
Comme d'autres personnes l'ont mentionné, les classes aléatoires Boost sont un bon début.Leur implémentation est conforme au code PRNG prévu pour TR1 :
http://www.boost.org/doc/libs/1_35_0/libs/random/index.html http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1452.html
Si vous disposez d'une version récente du compilateur G++, vous trouverez peut-être les bibliothèques TR1 déjà incluses
C++11 a adopté une bibliothèque de nombres aléatoires robuste basée sur boost.random.Vous pouvez accéder à un certain nombre de moteurs de nombres aléatoires utilisant différents algorithmes pour répondre à vos exigences de qualité, de vitesse ou de taille.Des implémentations de qualité donneront même accès à tout RNG non déterministe proposé par votre plateforme via std::random_device
.
De plus, il existe de nombreux adaptateurs pour produire des distributions spécifiques, éliminant ainsi le besoin d'effectuer une telle manipulation à la main (ce qui est souvent mal fait).
Boost.Random
est mon premier choix pour le RNG