par , 26/12/2015 à 12h36 (2798 Affichages)
Le langage VBA dispose de la fonction Rnd pour générer des nombres aléatoires suivant une loi uniforme.
Par exemple, la formule Int(Rnd()*n) + 1 renvoie au hasard un nombre entier entre 1 et n de façon uniforme.
Cependant, cette fonction Rnd peut aussi nous servir à générer des nombres aléatoires suivant une distribution quelconque :
Prenons par exemple la distribution exponentielle, définie sur 0 -> +∞ par la fonction de densité f(x)=a*Exp(-a*x) (a supposé réel).
En prenant la primitive, on obtient la fonction de probabilité F(X) = (1 - Exp(-a*X)) toujours définie sur 0 -> +∞.
Par exemple, pour une variable X inférieure ou égale à une valeur U, on a la probabilité P(X<=U)=F(U).
Supposons maintenant un ensemble de n tirages de variables aléatoires Xi suivant une loi exponentielle (i compris entre 1 et n).
La probabilité d'avoir une valeur inférieure ou égale à Xi est donnée par la formule F(Xi)=i/n *.
On peut donc obtenir la variable Xi à partir de i, n et la fonction inverse de F.
Déterminons donc la fonction inverse de F :
1 2
| F(X) = 1 - Exp(-a*X)
X = -(1/a)*Log(1 - F(X)) |
D'où, pour la variable Xi:
Xi = -(1/a)*Log(1 - F(Xi))
en identifiant enfin F(Xi) avec * on obtient :
Xi = -(1/a)*Log(1 - (i/n))
Cette dernière formule nous permet d'obtenir la variable aléatoire Xi suivant une distribution exponentielle avec la fonction Rnd du départ :
Nous avons déja supposé un ensemble de n variables Xi (i compris entre 1 et n), il nous suffit donc de générer un entier au hasard entre 1 et n au moyen de l'expression Int(Rnd()*n) + 1, pour ensuite obtenir la variable Xi avec la formule Xi = -(1/a)*Log(1 - (i/n)).
Remarque :
Pour éviter le cas limite i=n et le plantage de la fonction log, on peut ajouter une gestion d'erreur et renvoyer dans ce cas "inf." :
1 2 3 4 5 6 7 8 9 10 11 12 13
| Public Function RndExp(n As Long, a As Double) As Variant
Dim i As Long
On Error GoTo err_RndExp
i = CInt(Rnd * n) + 1
RndExp = -(1 / a) * Log(1 - (i / n))
Exit Function
err_RndExp:
RndExp = "inf."
End Function |