10
votes

Le générateur de nombres aléatoires de Fortran 90 peut-il être approuvé pour l'intégration de Monte Carlo?

J'ai écrit un algorithme d'intégration courte de Monte Carlo pour calculer une intégrale à Fortran 90. J'ai comparé une fois le résultat obtenu en résolvant l'intégrale par rapport à un paramètre à l'aide du générateur de nombres aléatoires intrinsèques avec la méthode de générateur de nombres aléatoires RAN1 présenté dans Recettes numériques pour Fortran90 Volume 2.

exécutant deux fois le même algorithme, une fois appeler la intrinsèque aléatoire (), puis appeler toujours aléatoire_number () et une fois appelé la méthode RAN1 () fournie dans le carnet de recettes numériques que j'ouvre en raison de la même forme, mais le résultat intrinsèque est une courbe continue contrairement au résultat de RAN1. Dans les deux cas, j'appelle la fonction avec des paramètres aléatoires 10 000 fois pour une valeur de paramètre q, ajoutez-le puis passez à la valeur Q suivante et appelez la fonction 10 000 fois etc.

Une image comparative du résultat peut être trouvée ici:  http://i.imgur.com/gzvfdop.png

Si j'augmente le nombre d'appels, les deux courbes convergent. Mais je me demandais: pourquoi le générateur de nombres aléatoires intrinsèques génère-t-il cette finesse? Est-il toujours recommandé de l'utiliser ou existe-t-il d'autres RNG plus conseillés? Je suppose que le résultat continu est le résultat du "moins" aléatoire du générateur de nombres intrinsèques.

(j'ai laissé de côté le code source car je ne pense pas qu'il y ait beaucoup d'informations. Si quelqu'un se soucie, je peux le remettre plus tard.)


4 commentaires

Utilisez tag Fotran pour toutes les questions Fortran. Ajouter une étiquette de version si nécessaire pour distinguer. Probablement pas ici BTW, car le même RNG est dans les versions ultérieures, 95, 2003, 2008, 2015 ...


Ah ok merci. Je n'ai pas encore repris sur les dernières versions de Fortran (comme je lisais quelque part qu'ils ne sont pas compatibles avec Python) et ne savaient pas s'ils changeaient le générateur de nombres aléatoires intrinsèques dans les versions plus récentes.


Je peux voir qu'il existe une réponse acceptée, mais j'aimerais poser quelques questions à remettre en question ma propre compréhension. Que voulez-vous dire par converger dans


Ce que je veux dire, c'est que la différence entre les deux méthodes devient plus petite pour augmenter le nombre d'appels d'évaluation de la fonction. En réalité, l'intégrale ne devrait pas aller à une valeur constante, mais devenez plus petite et plus petite avec une augmentation de la valeur Q (l'intégrale que j'essaie de résoudre est une forme de forme diffusante, elle devrait fondamentalement diminuer avec q ^ (- 4)) . Ainsi, alors que j'augmente le nombre d'appels de fonction de plus en plus de la courbe réelle devient visible et essentiellement, les deux rngs arrivent au même résultat. Je me demande simplement pourquoi le niveau de bruit à un appel trop peu de fonctions a l'air si différemment.


4 Réponses :


10
votes

Il n'y a aucune garantie quant à la qualité du générateur pseudo aléatoire dans le fortrange standard. Si vous vous souciez d'une qualité de mise en œuvre particulière pour la cryptographie ou la science sensible aux numéros aléatoires (Monte-Carlo), vous devez utiliser une bibliothèque que vous avez contrôlée.

Vous pouvez étudier le manuel de votre compilateur pour savoir ce qu'il est écrit sur le générateur de nombres aléatoires, mais chaque compilateur peut implémenter un algorithme complètement différent pour générer des nombres aléatoires.

Recettes numériques n'est pas bien accueillie par certaines personnes de la communauté de mathématiques numériques http: //www.uwyo.edu/buerkle/misc/wnotnr.html

Ce site n'est pas pour la recommandation de logiciels, mais cet article (lien de Roygvib dans un commentaire): HTTPS: //arxiv.org/abs/1005.4117 est un bon avis avec des exemples d'algorithmes mauvais et bons, méthodes Comment les tester, comment générer des distributions de nombres arbitraires et des exemples d'appels de deux exemplaires de bibliothèques en C (une des eux peuvent également être appelés de Fortran).

personnellement, j'utilise ce https://bitbucket.org/ladaf /elmm/src/master/src/rng_par_zig.f90 PRNG parallèle, mais je n'ai pas testé la qualité, j'ai personnellement besoin d'une vitesse. Mais ce n'est pas un site de recommandation de logiciel.


1 commentaires

Ah ok je n'ai pas vu ça! Merci cela rend tout un peu plus clair! Si quelqu'un d'autre se demande, j'ai utilisé la version 5.3.1 de Gfortran pour la compilation et utilise l'algorithme de Kiss. Probablement, je vais reculer dans ce cas de l'utilisation du code de recette numérique et je viens d'examiner le pro et le contre des différents algorithmes de PRNG et exécutez des tests supplémentaires. Merci!



1
votes

Je suis d'accord avec Vladamir F. mais ...

Pour vous aider dans votre quête de nombres aléatoires meilleurs, considérez l'ajout assez récent à C ++, C ++ 11 Pseudo Nombre aléatoire Générateurs . Mersenne Twister et Beaucoup d'autres sont là. C'est un système assez bien pensé. Je vois que vous pouvez tester ces séquences: p>

  • Faites un appel système de Fortran à un petit utilitaire C ++ qui génère un groupe d'entre eux pour vous ou LI>
  • Liez les générateurs de nombres aléatoires à Fortran via ISO_C_BINDING. LI> ul>

    Je préfère la seconde et parce que les fixations sont un peu difficiles, j'ai préparé un exemple. Les fichiers sont: p>

    1. CXX11_RAND.H et CXX11_RAND.CPP qui définissent les appels vers le générateur de nombres aléatoires LI>
    2. C_RAND.CPP qui appelle les fonctions C ++ dans les fonctions C LI>
    3. f_rand_m.f90 qui lie les fonctions C à fortran li>
    4. f_main.f90 qui utilise les fonctions du module pour générer 10 nombres aléatoires dans [0,1). LI> OL>

      CXX11_RAND.H H2>
      compiling objects
      building & executing fortran main
        0.47439556226575341
        0.11177335018127127
        0.10417488557661241
        0.77378163596792404
        0.20780793755332663
        0.27951447624366532
        0.66920698086955666
        0.80676663600103105
        0.98028384008440417
        0.88893587108730432
      


5 commentaires

Beaucoup de ces algorithmes ont une mise en œuvre de fortrange disponible.


Je ne suis pas sûr que c'est constructif ... La plupart des algorithmes ont des implémentations dans de nombreuses langues disponibles. Mais les C ++ sont aussi proches d'une implémentation «standard» que vous pouvez trouver, et il n'est pas difficile d'écrire les liaisons.


Il est évidemment des programmes en Fortran. Je ne veux pas parler pour le pot, mais quand je suis prrogramme à Fortran, il est plus facile pour moi d'appeler des implémères de fortrange (et je sais comment appeler C ++). Et de nombreux algorithmes sont si vieux que j'appellerais la version de la Fortrane "Standard". En outre, Fortran est simplement une langue plus facile et plus propre.


Ce que l'OP a voulu: un tas de PRNG différent à tester en utilisant sa langue choisie de Fortran. Ma solution: Je sais que vous avez g ++ si vous avez gfortran - alors copiez / collez ces liaisons dans votre base de code FORTRAN pour accéder aux générateurs de nombres aléatoires C ++ 11 de Fortran. Votre solution: sortez et trouvez ces algorithmes en Fortran, et je suis d'accord avec vous qu'ils doivent exister. Mais le temps qu'il faut pour les trouver et vérifier leur qualité ... je pense que c'est non négligeable. Mais bon, acceptez de ne pas être d'accord. :)


Eh bien, je ne suis pas sûr de ce qu'il voulait, un groupe de PRNG? Je ne le vois pas dans la question. Demander des bibliothèques est hors tension sur Stackoverflow quand même. Dans ma lecture, il demandait des propriétés du générateur intrinsèque et s'il y en a de mieux disponible. Pas pour recommandation d'une bibliothèque particulière.



0
votes

PRNG est une mauvaise option lorsque vous faites mc et que cela n'a pas d'importance dans lequel la langue de programmation. Pour les simulations MC, il est toujours judicieux d'utiliser un service comme org aléatoire ou générateur de numéro aléatoire matériel . Le livre Efficace Java , dans le point 47, montre clairement un exemple de PRNG problématique. Avec PRNGS, vous n'êtes jamais sûr d'être correct avec leur mise en œuvre interne.


9 commentaires

Des simulations MC massives sur les supercalculateurs ne font pas d'utilisation de générateurs aléatoires matériels. Ils utilisent des PRNG et un travail scientifique sérieux se fait avec eux. Comme Accueil.thep.lu.se/pythia/pythia82html/randomnumbers.html A> Fermiqcd.net/fermiqcd/static/doxygen/html/classmdp__prng.htm l


Si le travail scientifique est grave, les PRNG ne sont pas l'outil qui doit être utilisé. Le fait que les gens le font ne signifie pas que c'est correct. Lisez l'article 47 du livre et vous découvrirez pourquoi. Il suffit de frapper un cas comme celui décrit dans le livre afin d'endommager votre recherche scientifique. Même dans le projet de Manhattan, les numéros aléatoires ont été très soigneusement sélectionnés dans les calculs pour être suffisamment bons.


Le projet Manhattan est l'âge de pierre. Nous avons des ordinateurs maintenant. Le fait qu'il y ait de mauvais générateurs ne signifie pas que tous sont mauvais. Beaucoup sont bons et sont soigneusement sélectionnés. Les gens les utilisent pour des calculs scientifiques, c'est-à-dire le fait. Il n'y a aucun moyen comment vous pourriez faire autrement pour une supercalaison à grande échelle.


C'est à la personne qui fait la recherche. Si cette personne est acceptable d'accepter le risque de fausses résultats en raison du PRNG, il peut aller de l'avant sans soucis.


Cet article est probablement utile arxiv.org/abs/1005.4117 (voir page 8 À propos de RAN2 VS RAN1 ou 0 , où l'OP utilise RAN1). MT semble aussi très agréable. BTW, je me demande quel est l'exemple de mauvais PRNG dans "l'article 47" (dans le livre Java) ...


@ROYGVIB C'est très utile. Todor, voir l'estimation de là faisant la fâble aléatoire.org "En général, le service coûte environ 1 USD par 4 millions de bits aléatoires. Une simulation de Monte Carlo à grande échelle avec 10 ^ 12 Nombre aléatoire coûterait donc 250 000 USD. . " la même chose avec les générateurs de matériel. Les supercalculateurs disponibles ne les ont tout simplement pas installés. Il n'y a pas d'autre choix à faire. Il n'y a tout simplement aucune autre option pratique que d'utiliser les PRNG.


Si vos recherches ont une erreur systématique, en raison du problème de PRNG, cela n'a pas d'importance combien vous allez sauvegarder. Si la quantité de nombres aléatoires est d'environ 10 ^ 12, votre calcul sera encore plus sensible aux numéros de PRNG.


Il y a pas d'autre moyen , tout simplement aucun. Il n'y a pas de générateurs de matériel dans les centres de superinformation ou seulement à peu d'ordinateurs. Ils ne sont tout simplement pas disponibles.


Il n'y a pas d'autre moyen uniquement pour les personnes qui ne veulent pas rechercher d'autre manière. Comme je l'ai dit faire ce que vous voulez avec les risques que vous prenez.



2
votes

Le générateur de nombres aléatoires en particulier utilisé dépend du compilateur. Peut-être documenté peut-être pas. Peut-être sujet à changement. Pour un travail de haute qualité, j'utiliserais la bibliothèque / code source d'ailleurs. Une page Web avec des implémentations de fortrange de la Mersenne Twister: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/mt/versions/fortran/fortran.html . J'ai utilisé http: //theo.phys. sci.hiroshima-u.ac.jp/~ishikawa/prng/mt_stream_en.html et vérifié contre la mise en œuvre initiale. Cette version est utile pour les programmes multi-threads.


1 commentaires

Merci beaucoup pour ce merveilleux lien! Notez que les auteurs (Matsumoto et Nishimura) sont les mêmes que les codeurs du C ++ 11 MT Moteur de numéro aléatoire standard , qui garantit un standard de qualité.