9
votes

C ++ TR1: Comment utiliser la distribution normale?

J'essaie d'utiliser les extensions C ++ STD TechnicalReports1 pour générer des chiffres après une distribution normale, mais ce code (adapté de Cet article ): xxx

imprime seulement 1" Génération de ... "Message de journal, puis ne quitte jamais la boucle ! Si j'utilise la distribution, j'ai commenté à la place, il se termine, alors je me demande ce que je fais mal. Toute idée?

Merci beaucoup!


0 commentaires

4 Réponses :


1
votes

Bien que cela semble être un bogue, une confirmation rapide serait de transmettre les paramètres de 0,0, 1.0 par défaut. Normal_Distribution :: Normal_Distribution () devrait égal normal_distribution :: Normal_Distribution (0.0, 1.0)


1 commentaires

Cela ne fonctionne pas non plus, il reste toujours bloqué effectuer le premier calcul ..



3
votes

Cela ne pendrait certainement pas le programme. Mais non sûr si cela répond vraiment à vos besoins. XXX


3 commentaires

Merci mec, ça marche comme un charme, mais je me demande pourquoi avec ce moteur ça marche, et non avec l'autre ..


Évidemment, la seule différence est votre utilisation du générateur de numéros MT19937, tandis que Jagannath utilise le STD :: TR1 :: Ranlux64_Base_01. Logiquement, je suppose que le bogue peut être dans votre mise en œuvre de l'objet MT19937 (Algo que je n'avais jamais entendu parler avant de le faire, Thx pour cela :-)) Cela ne fait pas partie de la bibliothèque STD.


Est-il possible de viller à viller à telle boucle lorsque vous dessinez des nombres aléatoires? Je me souviens que vous ne pouvez pas vous vectoriser une boucle qui a un appel de fonction.



2
votes

Si votre implémentation de génération de nombres aléatoires TR1 est buggy, vous pouvez éviter TR1 en écrivant votre propre générateur normal comme suit.

générer deux uniformes (0, 1) échantillons aléatoires U et V en utilisant n'importe quel générateur aléatoire en qui vous avez confiance. Ensuite, laissez R = sqrt (-2 journal (u)) et retourner x = r sin (2 pi v). (Ceci s'appelle la méthode Box-Mueller.)

Si vous avez besoin d'échantillons d'échantillons normaux avec MU et déviation standard Sigma, renvoyez Sigma * x + mu au lieu de Just X.


1 commentaires

Vient d'essayer cela. Il fonctionne super rapide - testé avec des échantillons de 1 m et il a présenté des statistiques presque parfaites pour des échantillons dans le 1-Sigma, 2-Sigma, etc.



7
votes

J'ai eu le même problème avec le code initialement affiché et étudié la mise en œuvre de GNU de

d'abord quelques observations: avec g ++ - 4.4 et utiliser le code bloque, avec g ++ - 4.5 et à l'aide de -std = c ++ 0x (c'est-à-dire pas TR1 mais la vraie chose) au-dessus du code fonctionne

IMHO, il y avait un changement entre TR1 et C + + 0x En ce qui concerne les adaptateurs entre génération de nombres aléatoires et consommation de nombres aléatoires - MT19937 produit des entiers, normal_distribution consomme des doubles

Le C ++ 0x utilise automatiquement l'adaptation, le code G ++ TR1 ne

Pour que votre code fonctionne avec G ++ - 4.4 et TR1, procédez comme suit xxx


0 commentaires