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.
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.
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
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.
L'entier étant choisi entre 0 et lambda ? C'est aussi simple que ça ?
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)
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à.
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.
Merci à tous les trois explications très claires !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager