Exponentielle et génération aléatoire en VBA

Raphael025 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Mon premier post sur ce forum !

J'ai observé un problème dans une macro excel :


Sub Test()
 
Randomize
  
   
Dim a As Double
Dim b As Double
Dim g As Double
 
Dim i As Integer
 
For i = 1 To 5000
 
a = Rnd()
b = Rnd()
      
g = Sqr(0.1) * Sqr(-2 * Log(a)) * Cos(2 * WorksheetFunction.Pi * b)
 
Range("A" & i).Value = g
Range("B" & i).Value = 10 * Exp(g)
 
 
Next
 
End Sub



J'utilise l'algorithme usuel de génération de gaussienne et j'en prend l'exponentielle. Par théorème, la moyenne des exponentielles devrait être l'exponentielle de la moyenne des gaussiennes et donc 1.

Or, en calculant la moyenne des valeurs obtenues sur ma feuille excel, je trouve un résultat systématiquement supérieur à 10. Le plus souvent ~10.5, ce qui me paraît vraiment élevé pour être une simple erreur d'estimation ( surtout avec 5000 tirages).

Alors je me demande à quoi est du mon erreur ? Ma programmation, un arrondi malheureux, une exponentielle douteuse ?

Merci énormément et à bientôt !

Raphaël

3 réponses

eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Bonsoir,

Je ne connais pas ton algorithme usuel mais un piège classique sur vba :
avec log on s'attend à travailler avec le log décimal or il s'agit du log népérien.
Si jamais...

eric

edit:
Par théorème, la moyenne des exponentielles devrait être l'exponentielle de la moyenne des gaussiennes et donc 1.
Je vais peut-être dire une bétise mais tu mets 10 * Exp(g) et non Exp(g), c'est peut-être normal que tu trouves une valeur 10 fois plus élevée (?)
0
Raphael025 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Bonsoir Eric,

Merci beaucoup pour ta réponse.

L'algorithme usuel est en fait celui de Box-Muller :

https://www.taygeta.com/random/gaussian.html

Il s'agit du log népérien qui est utilisé.

Je me demande vraiment s'il y'a un erreur dans mon code, ou si c'est l'arrondi qui plante...La suite converge rapidement vers 10.5 alors qu'elle devrait converger vers 10.

edit :

La moyenne de 10*Exp(g) devrait être 10 fois la moyenne de Exp(g) soit 10*1.
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Si tu es sûr de ton algorithme on peut supposer des erreurs d'arrondis (courants et normaux dans excel, amplifiés par l'exponentielle (?))
Sur ce site on trouve des fonctions plus précises dont AleaStable() qui permet de générer des nombres selon une loi normale (est-ce réellement ce que tu veux, pas sûr).
Peut-être pas vraiment adapté à ton pb (j'avoue être dépassé) mais si ça te permet de générer une suite de meilleure qualité. A toi de voir...
eric
0