7
votes

Tester la qualité des PRNG

Je joue avec PRNGS (comme Mersenne Twister et Rand () Fonction de STDLIB) et je voudrais un bon test qui m'aiderait à déterminer la qualité des données aléatoires produites par les PRNG. J'ai calculé la valeur de PI en utilisant des nombres aléatoires générés par les PRNG, et je trouve rand () et Mersenne Twister pour être très proche d'une distinction (dois-je examiner après 10 points décimaux? ).

Je n'ai pas beaucoup d'idée des simulations de Monte Carlo; S'il vous plaît laissez-moi savoir sur un algorithme / une application (éventuellement quelque chose de simple pour laquelle cela pourrait fournir de bonnes inférences) qui m'aiderait à les distinguer en termes de qualité.


edit 1: Je n'ai pas remarqué précédemment, mais il y a un thread similaire: Comment tester des nombres aléatoires?

edit 2: Je ne suis pas en mesure d'interpréter les résultats du NIST, comme mentionné dans l'un des commentaires. J'ai eu cette idée d'interpréter visuellement le motif (le cas échéant) de aléatoire.org et suivez-le que En raison de sa simplicité. Je serais très heureux que quelqu'un puisse commenter le processus de mes tests:

  1. générer n randoms de [0,1] à l'aide de rand () et MT1997
  2. Si (rond (genrand_real1 () / rand_0_1 ())) puis pixel rouge, sinon noir

    Si je comprends bien que ce n'est pas une solution très précise, mais si cela fournit une estimation raisonnable, je pourrais alors vivre avec cela au moment présent.


3 commentaires

Je ne suis pas si sûr d'obtenir des données aléatoires de de Pseudorandom Number Generators - mais je pense que vous pourriez implémenter EN.Wikipedia.org/wiki/fair_Coin#fair_results_from_a_biased_c Oin avec eux ..


Dites-vous cela parce que les valeurs générées de PRNG sont prévisibles? Je vous remercie


Oui, c'est la distinction - c'était juste un rappel pour vous de vérifier si un PRNG est bon pour votre application et que vous n'avez pas besoin d'un TRNG comme aléatoire.org


3 Réponses :


0
votes

Vous êtes préférable à regarder dans le Volume 2 de la série de Knuth .

Pour une lecture plus courte, recherchez le chapitre correspondant des recettes numériques.

Si vous n'êtes intéressé que par une sorte de base de base pour une simulation MC --- Les générateurs congruentiels linéaires sont mieux évités, Mersenne Twister est assez bon dans la vaste majorité des cas.


2 commentaires

Pouvez-vous donner un lien à la preuve de la prétention selon laquelle les LGC sont mieux évitées pour les simulations de Monte-Carlo?


@ziggystar: Eh bien, vous pouvez vous lever à Knuth. Ou recettes numériques. Ou Google dans les résultats des suites de test standard, par exemple de la réponse CSGillePie.



4
votes

Il existe deux suites de test standard pour tester des nombres aléatoires.

  1. Suite Test . Ils ont un Mise en œuvre en C.
  2. Suite Test Diehard (Développée par George Marsaglia). Il y a un C Bibliothèque C Mise en œuvre de ces tests.

    Il y a une interface R à la bibliothèque de Dieharder, appelée RDieharder . Cette bibliothèque fournit une interface avec les suites Test Nist et Diehard.


3 commentaires

J'utilise NIST, mais je pense que bien que mon test passe, il y a un problème; Peux-tu aider s'il te plait? - J'ai généré de longues valeurs aléatoires et les converties en binaires et stockées dans un fichier. Disons 100 Randoms y a-t-il dans le fichier, j'écris 100 et suivez les étapes décrites dans la section "Exécution du code de test" du doc ​​(choisi les flux de bits générés à 10 comme dans le document). Mais je vois que mon "finalAnalysisReporport.txt" pour le cas de test par défaut ne contient presque aucune information.


Votre meilleur pari est de poser une autre question.


Cette réponse était bonne, mais est obsolète maintenant. Voir l'autre réponse pour une mise à jour (TL; DR: L'ECUYER'S TESTU01, ou PRACTRAND).



11
votes

Il existe plusieurs suites de tests statistiques disponibles. J'ai écrit, copié, et a rassemblé autrement 120 prngs et testé chacun avec une variété de suites de tests données 4 heures par PRNG par Suite Test:

  • PRACTRAND (standard, 1 téraoctet) Biais de 78 PRNGS
  • Testu01 (BigCrush) a trouvé parti pris dans 50 PRNGS
  • Rabisete (étendu, 512 Megabit, X1) a trouvé parti pris dans 40 PRNGS
  • Dieharder (options de ligne de commande personnalisées) Biais dans 25 PRNGS
  • Dieharder (-a option de ligne de commande) trouvé biais dans 13 PRNGS
  • NIST STS (par défaut, 64 mégabit x128) Biais en 11 PRNGS

    Combien de ceux qui se trouvaient dans les PRNG que les autres suites de tests ont tous manqué?

    • PRACTRAND (STANDARD, 1 TERABYTE) a trouvé 28 biais uniques, dans une grande variété de catégories.
    • RABIGETE (étendu, 512 Megabit, X1) Trouvé 5 biais uniques, tous dans les LCG et les LCG combinés.
    • TESTU01 BigCrush a trouvé 2 biais uniques, tous deux dans de petits ngns chaotiques.
      Aucune autre suite de tests n'a trouvé de biais unique.

      en bref, seul PRACTRAND, TESTUT01 et éventuellement RABIGIIRET valent la peine d'être utilisé.

      Divulgation complète: j'ai écrit PRACTRAND, donc l'ensemble des PRNG ou toute autre mesure non qualitative pourrait être biaisé en sa faveur.

      Avantages divers:

      • PRACTRAND et TESTU01 ont tendance à être les plus faciles à interpréter le résultat de mon avis.
      • PRACTRAND et DIEHARDER ont tendance à être les plus faciles à automatiser les tests pour via une interface de ligne de commande, je pense.
      • PRACTRAND et RABIGETE ont été les seuls à soutenir des tests multithreads.

        Divers inconvénients:

        • PRACTRAND a nécessité plus de bits d'entrée à tester que d'autres suites de test - pourrait être un problème si votre RNG est très lent ou limité autrement à la quantité de données produites.
        • RabIgIRET et STS NIST ont tous deux des problèmes d'interface.
        • Dieharder et Nist STS ont tous deux des problèmes faussement positifs.
        • Nist STS avait la pire interface à mon avis.
        • Je ne pouvais pas obtenir Dieharder de compiler sur Windows. J'ai réussi à obtenir Testu01 pour compiler sur Windows, mais il a fallu du travail.
        • Les versions récentes de RABIGETE sont fermées et Windows uniquement.

          L'ensemble des PRNG testés: L'ensemble PRNG comprend 1 grand GFSR, 1 grand LFSR, 4 PRNG de type XORSHIFT, 2 PRNG de type XORWOW, 3 autres PRNG non-LFSR. Il comprend 10 LCGS de modulus de Power-2 simples (qui défaussent les bits faibles pour atteindre des niveaux de qualité acceptables), 10 modules de puissance de-2 non-LCGS et 9 générateurs combinés basés principalement autour de LCGS et non-LCGS . Il comprend 19 versions de force réduites de CSprngs, plus une résolution complète CSprng. Parmi ceux-ci, 14 étaient basés sur des boîtes S Indirection / Dynamic (par exemple RC4, ISAAC), quatre étaient des paramétrisations Chaca / Salsa, et les 2 restants étaient des variantes de trivium. Il comprend 11 prngs largement classifiables en tant que type LFIB ou similaire, ne comptant pas les LFSR / GFSRS. Le reste (environ 35) étaient de petits PRNG chaotiques de l'état, dont 10 multiplication d'occasion et les autres étaient limités à la logique arithmétique et bit dans le sens.

          EDIT: Il y a aussi le test de test dans Gjrand , qui est très obscur et un peu étrange, mais vraiment très bien.

          En outre, tous les PRNG testés sont inclus dans les PRNG non recommandés dans PRACTRAND.


2 commentaires

Je suis heureux de recommander votre réponse, cependant, comme écrit, il n'y a aucune preuve. Pouvez-vous fournir des liens vers des papiers, ce qui sauvegarder votre demande? Ou quelques instructions sur la manière de répéter vos expériences.


Aucune preuve que ce que ce soit! Dieharder a environ 106 tests. PRACTRAND et TESTU01 sont écrits en C et C ++ et ont besoin que l'utilisateur d'intégrer leur générateur! Les plus simples jamais à utiliser jusqu'à présent sont Dieharder (forfait Ubuntu) et NIST STS (UI Python et mise en œuvre)! Je crois fermement que vous êtes biaisé à votre travail et que @CSGILSPIE mentionné dans son commentaire, vous devez fournir un document qui soutient vos créances!