IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Générer des nombres aléatoires suivant une distribution exponentielle


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut Générer des nombres aléatoires suivant une distribution exponentielle
    Bonjour,

    je voulais savoir s'il existait un moyen facile de générer des nombres aléatoires suivant une distribution exponentielle de paramètre lambda spécifié ?

    Ou comment la coder soit même si elle n'est pas trop compliquée ?

    Merci.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Bonjour

    • faire un tableau de la taille désirée contenant l'exponentielle aux pas souhaités.
    • utiliser rand pour choisir un indice, et remplir un second tableau avec cet indice


    Sinon :

    • choisir un pas
    • utiliser rand pour déterminer le facteur mutliplicatif du pas
    • stocker le point correspondant
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    et merci.

    Qu'est-ce tu entends par "choisir un pas" ?

    Pour faire plus concret peut-être :

    - je veux simuler une suite d'événements (un homme traverse la rue), c'est à dire tirer aléatoirement une suite d'intervalles de temps entre deux hommes qui traversent la rue
    - je sais qu'en moyenne un homme traverse la rue toutes les 5 min (mon lambda)
    - on admet que la durée entre deux événements suit une loi de poisson de paramètre lambda
    - pour tirer mes intervalles, je veux donc un nombre aléatoire qui suive une loi exponentielle négative.

    C'est ce tirage que je cherche à faire en C.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fuyo2004 Voir le message
    Qu'est-ce tu entends par "choisir un pas" ?
    ça :


    Citation Envoyé par fuyo2004 Voir le message
    - je sais qu'en moyenne un homme traverse la rue toutes les 5 min (mon lambda)


    Il ne te reste plus qu'à choisir aléatoirement un entier qui sera le facteur multiplicatif de ce pas dans l'exponentielle..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    L'entier étant choisi entre 0 et lambda ? C'est aussi simple que ça ?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    entre 0 et lambda si tu veux avoir une courbe autour de lambda (exp - n), entre 0 et N si tu veux avoir une courbe où les points sont séparés par des parties d'intervalles de 5 minutes (exp -n * 5 )

    Dans ce dernier cas, le N max peut être chosi comme donnant le chiffe minimum (FLT_EPSILON ou DBL_EPSILON)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Il te suffit de générer des Uniformes(0,1) et après, grâce à l'inversion de la fonction de répartition de la loi exponentielle, tu pourras transformer ces uniformes en exp lambda.
    Concrètement : la fonction de répartition est distribuée uniformément sur l'intervalle [0; 1]
    En posant : U = 1 - exp(Lambda.X)
    exp(Lambda.X) = 1 - U. En LOI c'est équivalent à exp(Lambda.X) = U
    Et donc X = (1/Lambda) Log(U)

    Donc si u est la réalisation d'une uniforme(0,1), (1/Lambda) Log(u) est la réalisation d'une loi exponentielle de paramètre Lambda.

    Voilà.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Les idées d'algoverage sont bonnes mais j'avoue que la rédaction est mal soignée. Voici donc plus clairement en quoi elles consistent.

    Supposons que l'on veuille générer des nombres aléatoires selon une loi de densité de probabilité f donnée. Soit F sa fonction de répartition. Il suffit alors de générer des nombres aléatoires selon la loi uniforme sur [0, 1] et d'appliquer à chaque nombre obtenu la fonction inverse de F, que l'on va noter G. Dans le cas d'une loi exponentielle :

    - f(x) = Lambda.exp(-Lambda.x)
    - F(x) = 1 - exp(-Lambda.x)
    - G(y) = (-1/Lambda).ln(1 - y)

    Si on pose donc u() = une fonction qui tire au hasard un nombre compris entre 0 et 1 (se qui se fait facilement avec rand) et G(x) = (-1/Lambda).ln(1 - x), G(u()) permet donc de tirer un nombre aléatoire suivant une loi exponentielle de paramètre Lambda.

    On peut cependant remarquer G(u()) = (-1/Lambda).ln(1 - u()) et que u() et 1 - u() suivent la même loi (même espérance mathématique, même variance, etc.). On peut donc remplacer, pour nos calculs, le 1 - y de G par y tout simplement. Il convient donc d'utiliser désormais la fonction H suivante à la place de G : H(x) = (-1/Lambda).ln(x)

    La méthode d'inversion de la fonction de répartition n'est pas la seule méthode existante. Cependant, elle a l'avantage d'être très simple et de correspondre à tes besoins.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    Merci à tous les trois explications très claires !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] générer des nombres aléatoires avec randn() dans une boucle
    Par Anna76 dans le forum MATLAB
    Réponses: 2
    Dernier message: 28/07/2014, 13h55
  2. Réponses: 1
    Dernier message: 19/05/2011, 12h48
  3. Générer des nombres aléatoires
    Par nbeligh dans le forum C++
    Réponses: 6
    Dernier message: 05/09/2006, 16h05
  4. Algo pour générer des nombres aléatoires
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2006, 09h06
  5. Réponses: 2
    Dernier message: 16/05/2006, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo