Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

C++ variable aléatoire de Bernoulli



  1. #1
    Martin00

    C++ variable aléatoire de Bernoulli


    ------

    Bonsoir,

    existe-t-il une fonction pour générer une variable aléatoire de Bernoulli en C++?
    Google ne m'a pas été d'un grand secours.

    Bonne soirée.


    (VA de Bernoulli: prend la valeur 1 avec la probabilité p et 0 avec la probabilité 1 − p.)

    -----

  2. Publicité
  3. #2
    univscien

    Re : C++ variable aléatoire de Bernoulli

    Je sais pas vraiment ce que tu attends, mais recoder une fonction de ce genre ne doit pas être très compliqué. Si tu nous donnes plus d'info avec un exemple ce sera plus parlant
    68 74 74 70 3A 2F 2F 77 77 77 2E 6A 65 72 72 6F 72 34 30 34 2E 66 72

  4. #3
    Martin00

    Re : C++ variable aléatoire de Bernoulli

    de manière plus précise,
    je souhaiterais avoir un fonction "Bernoulli(double p)" qui retournerait 1 avec la probabilité p et 0 avec la probabilité 1-p.

    Par exemple, on considère une pièce de monnaie truquée de telle sorte qu'elle a une probabilité p de tomber sur pile et 1-p de tomber sur face. Le résultat pile étant assimilé à 1 et le résultat face étant assimilé à 1-p.

    Je pense pouvoir coder une telle fonction grâce à la méthode d'inversion de variables aléatoires, mais s'il y a plus simple je suis preneur...

    en fait j'ai trouvé un package sur internet qui contiendrait une telle fonction, mais je ne sais pas comment l'installer (je débute en C++, que faut il faire exactement avec les .h?):
    http://www.agner.org/random/
    (dans Non-uniform random number generators in C++)

  5. #4
    jozog47

    Re : C++ variable aléatoire de Bernoulli

    Tu peux tout simplement générer une variable de loi uniforme sur [0;1] (notons la X), tu renvoies 0 si X>p et 1 si X<p. On renverra bien 1 avec proba p et 0 avec proba 1-p.

    La fonction rand (initialisée par srand) va te renvoyer un entier entre 0 et un certain entier RAND_MAX : pour avoir assez de décimales, tu peux tirer un entier en 0 et 100000 puis diviser ce résultat par 100000, par exemple.

    Ca donne quelque chose comme ça :

    Code:
    #include <time.h>
    int bernoulli(float p)
    {
            srand ( time(NULL) );
            int retour = 0, max_nb = 100000;
            float nb = (rand()%max_nb)/max_nb;
            if ( nb < p )
            {
                    retour = 1;
            }
            return retour;
    }
    Dernière modification par jozog47 ; 10/10/2009 à 22h48.

  6. #5
    Martin00

    Re : C++ variable aléatoire de Bernoulli

    Merci!!
    j'ignorais tout de la fonction rand...

  7. A voir en vidéo sur Futura
  8. #6
    polo974

    Re : C++ variable aléatoire de Bernoulli

    faire un modulo sur le résultat de rand() fausse la distribution aléatoire.
    exemple:
    si RAND_MAX égale 32767 (valeur anciennement habituelle)
    si on fait un modulo 30000, les nombres sortants entre 30000 et 32768 se retrouvent entre 0 et 2768, doublant ainsi la probabilité de sortie de ces nombres.

  9. Publicité
  10. #7
    whoami

    Re : C++ variable aléatoire de Bernoulli

    Bonjour,

    Pour générer une valeur réelle dans l'intervalle [0..1], la bonne formule est :
    Code:
    (double)rand()/RAND_MAX;
    La fonction devient
    Code:
    int bernoulli(double p)
    {
            int retour = 0;
            double nb = (double)rand()/RAND_MAX;
            if ( nb < p )
            {
                    retour = 1;
            }
            return retour;
    }
    J'en ai sorti la ligne d'initialisation du générateur aléatoire, ce n'est pas sa place
    Code:
            srand ( time(NULL) );
    On ne doit initialiser le générateur qu'une fois, et en tout cas, pas dans une fonction qui risque d'être appelée fréquemment, avec peu d'écart de temps entre les appels.

    Au passage : préférer l'utilisation de double plutôt que float. Pour la plupart des compilateurs, c'est le type flottant par défaut.

  11. #8
    polo974

    Re : C++ variable aléatoire de Bernoulli

    Citation Envoyé par whoami Voir le message
    Bonjour,
    ...
    Au passage : préférer l'utilisation de double plutôt que float. Pour la plupart des compilateurs, c'est le type flottant par défaut.
    Effectivement, sur les machines genre PC, l'usage des float n'a plus vraiment de sens vu qu'il restreint les réels entre environ +/-10e+/-38 avec seulement 24 bits significatifs (soit même pas 7 digits) et que le compilateur par défaut fait les calculs en double, il y a donc perte de précision, risque de débordement et perte d'environ 30% en performance...

    Et comme actuellement, en général:
    RAND_MAX vaut 2147483647, soit 10 digits, le float ne suffit effectivement plus...

    Ma remarque sur le modulo reste vraie sur le risque de "repliement" non uniforme de la distribution.

  12. #9
    jozog47

    Re : C++ variable aléatoire de Bernoulli

    Je ne savais pas que l'utilisation des float affectait les performances, c'est bon à savoir.
    Et effectivement le fait de diviser par un nombre différent de RAND_MAX risque d'affecter sérieusement la probabilité sur un grand nombre d'essai...

  13. #10
    whoami

    Re : C++ variable aléatoire de Bernoulli

    Bonjour,
    Citation Envoyé par jozog47 Voir le message
    Je ne savais pas que l'utilisation des float affectait les performances, c'est bon à savoir.
    Si ça ne changeait rien, on n'aurait pas 2 types différents.

    Citation Envoyé par jozog47 Voir le message
    Et effectivement le fait de diviser par un nombre différent de RAND_MAX risque d'affecter sérieusement la probabilité sur un grand nombre d'essai...
    Ce n'est pas un simple risque, c'est un fait.

  14. #11
    polo974

    Re : C++ variable aléatoire de Bernoulli

    Citation Envoyé par jozog47 Voir le message
    Je ne savais pas que l'utilisation des float affectait les performances, c'est bon à savoir.
    Et effectivement le fait de diviser par un nombre différent de RAND_MAX risque d'affecter sérieusement la probabilité sur un grand nombre d'essai...
    Ce n'est pas la division qui pose problème, c'est le modulo ! ! !

Discussions similaires

  1. Variable Aléatoire
    Par Charlotte138 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 15/01/2009, 20h51
  2. Variable aléatoire ^^
    Par Armellle dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 08/04/2008, 17h44
  3. variable aléatoire
    Par sibio dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 08/03/2008, 09h04
  4. Probabilité, variable aléatoire.
    Par neokiller007 dans le forum Mathématiques du collège et du lycée
    Réponses: 17
    Dernier message: 31/01/2007, 00h51
  5. variable aleatoire
    Par julia dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 07/11/2004, 11h53
Découvrez nos comparatifs produits sur l'informatique et les technologies.