Est-ce que Fortuna ou Mersenne Twister sont préférables comme RNG algorithmique?


19

Une réponse récente mentionnait l'utilisation de générateurs de nombres aléatoires ( RNG ) Fortuna ou Mersenne Twister pour lancer une simulation Monte Carlo . Je n'avais jamais entendu parler de Fortuna auparavant, alors je l'ai recherché - il semble qu'il soit principalement destiné à un usage cryptographique.

J'utilise actuellement un Mersenne Twister dans le code de production pour créer un algorithme K-Means.

Laquelle (Fortuna ou Mersenne Twister) est considérée comme la meilleure pour les applications "d'amorçage algorithmique" (par exemple, l'amorçage de Monte Carlo et K-Means)? Ou est-ce un "lancer" - c'est-à-dire utiliser le plus pratique.

D'où je suis assis, le "meilleur" devrait fournir des nombres aléatoires de la plus haute qualité, fonctionner rapidement et (éventuellement) avoir une faible empreinte mémoire. Parmi eux, la qualité est probablement la plus importante pour la plupart d'entre nous.


6
Les PRNG cryptographiques ont tendance à être beaucoup plus lents que la plupart des autres PRNG; si vous faites une simulation de Monte-Carlo où vos opérations PRNG se chiffrent en millions, vous trouverez que les méthodes cryptographiques sont terriblement coûteuses.
JM

1
@JM - Avec un peu plus de détails, je pense que votre commentaire serait une bonne réponse. Il serait certainement intéressant de voir si la fonctionnalité de cryptographie accélérée matérielle moderne pourrait être utilisée pour créer un flux haute performance de nombres pseudo aléatoires cryptographiquement sécurisés.
Mark Booth

@JM bon point sur le ralentissement des RNG cryptographiques - marque contre Fortuna
winwaed

Voici une bonne liste de PRNG et de nombreuses statistiques différentes que vous trouverez peut-être utiles, cela vous aidera> boost.org/doc/libs/1_48_0/doc/html/boost_random/…
pyCthon

Mon problème avec cstdlib était la granularité - seules RAND_MAX=32768les valeurs possibles. J'utilise actuellement MT pour Monte Carlo raytracing sim. Cependant, je ne vois pas la MT comme un goulot d'étranglement des performances dans mon profileur, probablement parce que je fais une génération "aléatoire" de choses comme les directions des rayons en tant que pré-processus . Par exemple, je peux générer un tableau de 100 000 rayons au démarrage, les stocker dans un tableau et sélectionner au hasard la position de départ du tableau au moment de l'exécution (en cours d'exécution pour 10 000 rayons environ de la collection). Cela a une surcharge de mémoire relativement élevée, en échange de bonnes distributions de nombres aléatoires.
bobobobo

Réponses:


14

Eh bien, tout est un compromis d'une sorte ou d'une autre. Pour les générateurs de nombres aléatoires, je les regroupe en 3 catégories de base:

  1. Assez bon pour les devoirs.
  2. Assez bon pour parier sur votre entreprise.
  3. Assez bon pour parier sur votre pays.

Les PRNG linéaires congruents (la méthode généralement mise en œuvre dans la plupart des bibliothèques) sont solidement dans la catégorie 1. Fortuna et Mersenne Twister sont solidement dans la catégorie 2.

Pour un article intéressant sur la façon dont gâcher un algorithme de mélange peut vous coûter votre entreprise / casino, je recommande celui de 1999 . En raison de la pourriture du lien, les images ont disparu, mais la figure 4, celle où vous tracez le numéro suivant du PRNG par rapport au numéro précédent généré, est un ensemble de lignes parallèles.

Comme le souligne JM, Fortuna est lent. Comme vous l'avez souligné, Mersenne Twister est assez rapide.


2
Parcourant rapidement la version imprimable de l'article , la "figure 4" semble être du code au lieu d'une image. « Figure 5 » regards Kaput, mais c'est l'image que je suis de la Wayback Machine .
JM

Merci. on dirait que la vitesse est une marque contre Fortuna dans ce cas. Ré. Mauvais mélanges: oui j'en sais assez (pas beaucoup!) Qu'il est facile de "défaire" le caractère aléatoire d'un RNG - par exemple, en choisissant une mauvaise graine de départ.
winwaed

Une autre version avec de meilleures images est disponible sur: cigital.com/papers/download/developer_gambling.php
Tangurena

1
Les LCG 96 bits avec sorties 32 bits passent plus de tests statistiques que les Twister Mersenne. Personne ne devrait utiliser un Mersenne Twister de nos jours, étant donné qu'il est si facile de créer des PRNG non cryptographiques décents qui sont bien meilleurs que le MT à tous égards significatifs.
Veedrac

4

Le choix par défaut dans la catégorie "cryptographique" est Blum-Blum-Shub , je pense. Comme la page wikipedia le dit déjà, cela ne convient pas aux simulations car c'est trop lent.

Si vous utilisez un système de type Unix, vous pouvez également envisager d'obtenir vos nombres aléatoires directement à partir de / dev / urandom , le service du système d'exploitation qui fournit des nombres aléatoires de bonne qualité (mais pas nécessairement crypto). Selon le système d'exploitation particulier que vous utilisez, cela peut utiliser l'algorithme Yarrow - dont Fortuna est une variante. Mais l'aspect le plus intéressant est que le système d'exploitation a accès à de vrais nombres aléatoires: le bruit thermique des capteurs de température internes, par exemple. En règle générale, ces données sont mélangées dans le pool aléatoire chaque fois qu'elles deviennent disponibles pour garder les données imprévisibles.

Ce concept de mélange au hasard suggère qu'il pourrait être possible d'obtenir le meilleur des deux mondes comme suit. Utilisez un générateur de nombres aléatoires plus rapide et de relativement bonne qualité tel que Mersenne comme RNG de base. Maintenez également un deuxième générateur de nombres aléatoires de meilleure qualité - par exemple Fortuna. Chaque nombre, disons 25, exécute une itération du meilleur RNG et ajoute le résultat à l'état de votre RNG de base. De cette façon, vous obtiendrez des performances assez élevées et des résultats de qualité assez élevée. (Je suppose que ce serait inutile pour la cryptographie, car la force de ce générateur composite pourrait bien être la force du maillon le plus faible. Mais pour les simulations, où vous n'avez généralement pas d'adversaire malveillant, cela pourrait fonctionner.)


/ dev / urandom est sécurisé à utiliser pour la cryptographie sur linux et free-bsd. Regardez cette réponse
Adam Kurkiewicz

Pour les simulations, pourquoi serait-il souhaitable que les nombres aléatoires soient vrais? Bien sûr, certains générateurs de nombres pseudo-aléatoires sont pires, mais d'autres seront à égalité à toutes fins pratiques. Alors, pourquoi considérez-vous la justesse comme une bonne caractéristique en soi?
Wrzlprmft

2

Je voulais intervenir pour dire que j'ai récemment suivi ce processus avec une simulation et je dois noter que l'utilisation de Fortuna n'est pas hors de question si elle est vraiment nécessaire. Dans notre cas, nous craignions que l'entropie de MT ne soit pas suffisamment élevée, ce qui se traduirait dans notre simulation par un biais. Donc, pour notre simulation, nous avons utilisé Fortuna en tirant environ 65 milliards de nombres aléatoires de cet algo. Le fait est que les ordinateurs sont rapides, si vous en avez vraiment besoin, vous pouvez les utiliser si vous avez une raison. Si vous faites simplement quelque chose comme une intégration Monte Carlo, restez avec MT.


0

Je pense que la réponse dépend beaucoup de l'application que vous envisagez d'utiliser pour le RNG. Je suggérerais une quatrième catégorie pour le classement approximatif de Tangurena: "Bon sans réel gain".

Pour de nombreuses applications, cela n'a tout simplement pas d'importance, et un RNG correctement cryptographique peut simplement ralentir vos tâches sans aucun gain de validité proportionnel. Par exemple, une grande partie de la recherche que je fais nécessite simplement plusieurs millions de nombres provenant à peu près d'une distribution que je spécifie. Presque n'importe quel RNG fera l'affaire, donc tout ce dont j'ai besoin est un qui n'est pas si catastrophiquement pauvre qu'il ne vaut rien comme un RNG. Toute autre chose ralentit simplement le travail inutilement. J'ai tendance à utiliser Mersenne Twister, mais c'est simplement parce que cela fonctionne assez bien, j'ai le code et c'est assez rapide.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.