Génération de nombre aléatoire robuste

Je suis à la recherche d'un RNG performant et raisonnablement robuste n'utilisant pas de 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. Sur Linux / etc, nous avons un drand48() qui génère 48 bits aléatoires. Je voudrais une fonction / classe similaire pour C ++ ou C# qui peut générer plus de 32 bits de caractère aléatoire et les bits de poids faible qui soient aussi aléatoires que les bits de poids fort.

Il ne doit pas nécessairement être cryptographiquement sécurisé, mais il ne doit pas utiliser ou ê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 devrais-je rechercher?

0
ajouté édité
Vues: 2
@ bames53 J'ai posté un vote de réouverture maintenant. Vous semblez avoir assez de rep, alors faites-le. :-RÉ
ajouté l'auteur Chris Jester-Young, source
Pourquoi pas System.Random ? Je sais que rand est pauvre, est-ce que System.Random est aussi pauvre? Si oui, c'est triste :(
ajouté l'auteur Mooing Duck, source
La justification de la fermeture de cette question ne semble pas correcte du tout.
ajouté l'auteur bames53, source
Je suppose que maintenant vous pouvez simplement
google
ajouté l'auteur Sergio, source

9 Réponses

Ce sujet a été longuement discuté sur StackOverflow, il est assez indépendant du processeur et indépendant du langage, à l'exception des coûts relatifs de multiplication/addition/recherche, qui rendront certaines implémentations plus attrayantes.

La fonction atan2 (), ou conversion rectangulaire-polaire, n'est pas complètement implémentable par des tables de recherche de taille raisonnable; CORDIC est une option.

3
ajouté

Have a look at the CORDIC algorithms in section 31.2 of the fxtbook: http://www.jjj.de/fxt/

2
ajouté

Vous codez sur un PIC, combien de bits est votre angle? Si vous avez un numéro de 8 bits, une table de consultation peut être facile, si vous avez un numéro de 16 bits, alors c'est une histoire différente.

Normalement, dans les PIC, un nombre de 8 ou 10 bits est à peu près aussi grand que vous obtiendrez, une table de consultation est probablement correcte. Les gens se perdent souvent en obtenant un numéro de haute précision, normalement vous n'en avez pas besoin. J'ai eu quelqu'un qui lisait un nombre de 12 bits d'un capteur, utilisant des doubles et obtenant une conversion vraiment précise. Cela fonctionnait parfaitement quand il utilisait une source de tension comme entrée pour tester, mais vous ajoutez un vrai capteur avec son erreur et vous trouvez que toute la précision est une perte de temps.

Il y a des cas où je suggérerais d'utiliser une fonction sin/cos/tan de haute qualité, je n'en ai jamais rencontré sur un PIC. Pardonnez-moi si vous avez besoin d'une fonction de signe de haute qualité, je réponds juste ce qui serait la bonne réponse pour 95% des cas.

1
ajouté
D'accord Amos, j'aime bien ta solution aussi, mais le spectacle de multiplication soit choisi en fonction de la présence de matériel pour cela normalement, tous les PIC n'ont pas de multiplicateurs matériels. En réalité, vous pouvez utiliser une table de recherche pour les degrés et une approximation linéaire simple à partir de là et ne jamais connaître la différence aussi si c'est important.
ajouté l'auteur Dan, source
De plus, si vous regardiez des angles avec une précision de 1 degré, vous auriez seulement besoin de valeurs 90ish dans le tableau. Tous les autres peuvent être dérivés des angles du premier quadrant. Si vous faites cela pour le sinus et le cosinus, vous pouvez déduire les valeurs de la tangente à partir de celles-ci: tan (thêta) = sin (thêta)/cos (thêta). Avez-vous besoin de faire arcsin, arccos et arctan aussi?
ajouté l'auteur svec, source

Un peu en retard, mais voici une solution PicBasic Pro pour les fonctions Trig. Il utilise un fichier d'assemblage Cordic pour les calculs rapides. Donne le résultat de Sin (x) et Cos (x), ou le résultat de atan2 (x, y) avec une précision d'environ 16 bits.

http://www.picbasic.co.uk/forum/showthread.php ? t = 10528

1
ajouté

Pour C ++, Boost.Random est probablement ce que vous cherchez. Il supporte MT (parmi beaucoup d'autres algorithmes), et peut collecter entropy via la classe nondet_random . Vérifiez-le! :-)

0
ajouté

The Gnu Scientific Library (GSL) has a pretty extensive set of RN generators, test harness, etc. If you're on linux, it's probably already available on your system.

0
ajouté

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 en utilisant différents algorithmes pour répondre à vos exigences de qualité, de vitesse ou de taille. Les implémentations de qualité permettent même d'accéder à tout RNG non déterministe proposé par votre plate-forme via std :: random_device .

En outre, il existe de nombreux adaptateurs pour produire des distributions spécifiques, ce qui élimine le besoin de faire une telle manipulation à la main (ce qui est souvent mal fait).

#include

0
ajouté

Boost.Random is my first choice for RNG

http://www.boost.org/doc/libs/random

0
ajouté
Vous pourriez trouver Boost au hasard en faisant des recherches sur Google, c'est pourquoi je dint fournir des liens. Maintenant, je l'ai mis à jour avec le lien vers lib.
ajouté l'auteur Rohit Vipin Mathews, source

Attention à 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 avez une version récente du compilateur G ++, vous pouvez trouver les bibliothèques TR1 déjà incluses

0
ajouté