Loi symétrique en C++

Bonjour
Imaginons que j'ai une loi $\mathbb{P}(x)$, dépendant d'un paramètre $x \neq 0$, symétrique au sens où $\mathbb{P}(x) = \mathbb{P}(-x)$.
Pour $x > 0$, j'arrive à simuler $\mathbb{P}(x)$ par une méthode aléatoire (rejet en l'occurrence).

Maintenant, puisque la loi est symétrique, j'ai donc en théorie réussi mon coup et je peux écrire mon programme
double maLoi(double x, mt19937_64 & gen){
    if (x > 0){
         return rejet(x, gen);
    }
   else{
       return maLoi(-x, gen);
   }
}
Seulement en pratique cela ne fonctionne pas : si je fais deux simulations de Monte-Carlo pour obtenir l'espérance de $\mathbb{P}(3)$ et $\mathbb{P}(-3)$, je n'obtiens pas la même chose.

Je pense que c'est lié au fait que le générateur ne devrait pas être utilisé avec la même graine mais je ne suis pas sûr (et je ne sais pas comment changer une graine); je serais reconnaissant à quiconque pouvant m'aider.

Réponses

  • Bonjour.

    C'est un peu bizarre, puisque tu utilises les deux fois la routine rejet(3, gen). Donc tu dois aussi obtenir des résultats différents si tu fais le test avec 3 et 3.

    Cordialement.
  • Bonjour gerard0.

    Je ne suis pas sûr de comprendre ce que tu dis.
    Je suis d'accord que la méthode doit renvoyer des nombres différents à chaque appel (puisque l'on utilise des nombres aléatoires) mais le souci est que quand je fais
    double sum1 = 0;
    double sum2 = 0;
    int N = 100 000;
    
    for (int i = 0; i < N; i++){
        sum1 += maLoi(3, gen);
        sum2 += maLoi(-3, gen);
    }
    
    et que je regarde ensuite sum1/N et sum2/N, je n'obtiens pas la même chose alors que ces deux espérances devraient être égales puisque la loi est symétrique.
  • Ne faudrait-il pas que "gen" ne soit appelé qu'une fois en le plaçant dans une matrice MaMatrive (par exemple) avant sum1 et sum2 (j'ai le sentiment que le générateur aléatoire est appelé 2 fois), non ?
  • @sevaus : Tu éviterais sans doute toutes ces hypothèses si tu fournissais TOUT le code : la fonction "maLoi" mais aussi la fonction "rejet". Les paramètres utilisés pour les appels des fonctions peuvent être utiles aussi (notamment "gen").
  • C'est un peu bizarre de ne pas comprendre que l'appel à la routine rejet(3,gen) pour x=3 et l'appel à la routine rejet(3,gen) pour x=-3 est la même chose. Donc que le problème ne vient pas de là. Peut-être de l'utilisation 100 000 fois d'un terme sur 2 pour x=3 et du suivant pour x=-3. La qualité du générateur peut alors intervenir.
    A priori, avec un bon générateur, on doit avoir deux résultats proches, pas nécessairement égaux, puisque c'est une simulation. Et on devrait avoir le même type de résultats pour le même programme où x=-3 est remplacé par x=3.

    Cordialement.
Connectez-vous ou Inscrivez-vous pour répondre.