Voir le flux RSS

User

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

Noter ce billet
par , 26/12/2015 à 13h36 (655 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 :

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
F(X) = 1 - Exp(-a*X)
X = -(1/a)*Log(1 - F(X))

D'où, pour la variable Xi:

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
Xi = -(1/a)*Log(1 - F(Xi))

en identifiant enfin F(Xi) avec * on obtient :

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
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." :

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
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

Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Viadeo Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Twitter Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Google Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Facebook Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Digg Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Delicious Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog MySpace Envoyer le billet « Générer des nombres aléatoires suivant une distribution quelconque » dans le blog Yahoo

Mis à jour 24/04/2016 à 21h52 par LittleWhite (Coloration code)

Catégories
Sans catégorie

Commentaires