Générer des nombres aléatoires qui se suivent

Lust

XLDnaute Nouveau
Bonjour à tous,

Mon problème est le suivant : je cherche à générer une suite de nombres aléatoires qui se suivent (ne pas faire un bond de 0 à 100 mais que cela se fasse de manière progressive) dont leur moyenne est égale à un nombre prédéfini.
Son application servirait à obtenir un profil quelconque de vent (toute les 1/2-heures par exemple sur 1 an) dont je connais la moyenne mensuelle (par exemple 3 m/s). Les valeurs doivent donc être > 0 m/s et < 25-30 m/s (pour rester réaliste).
J'ai essayé avec LOI.NORMALE.INVERSE() mais l'apparition de nombres négatifs et/ou de 2 nombres consécutifs très éloignés pose problème dans le réalisme attendu... J'ai également tenté avec les fonctions ALEA() et ALEA.ENTRE.BORNES() où j'arrive à obtenir une variation progressive mais pas à considérer la moyenne.
Je pense qu'un codage en VBA peut résoudre cela mais je suis novice en VBA ;)

Merci d'avance!

Lust
 

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Bonsoir.
Vous parlez de vitesse moyenne, mais ne serait ce pas plutôt une vitesse typique, une fraction imposée des vitesses à engendrer devant toujours se situer, par exemple, dans une fourchette allant de la moitié
au double ?
Ce qui en définirait du même coup une proportion plus grande dans une autre fourchette allant du dixième au décuple, et ainsi de suite. Mais jamais de vitesse nulle ni infinie. Ce serait le logarithme de la vitesse en somme qui devrait obéir à une distribution normale.

En attendant je vous livre cette fonction perso qui vous intéressera peut être :
VB:
Function DistrQsN(ByVal Rnd0à1 As Double, ByVal Moyenne As Double, ByVal ÉcartType As Double) As Double
Rem. Distribution quasi normale à part que le nombre engendré ne fuira la moyenne de plus de 4 fois l'écart type
DistrQsN = (Rnd0à1 ^ 0.18148 - (1 - Rnd0à1) ^ 0.18148) * 4 * ÉcartType + Moyenne
End Function
 
Dernière édition:

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

Merci pour votre réponse.

En ce qui concerne les valeurs de vitesse, elles doivent être comprise dans une fourchette plus ou moins grande avec une plus forte probabilité d'être autour de la moyenne se rapprochant effectivement d'une distribution normale.

Pour info, voilà la fonction que j'avais créé qui "marchait" mais ne prenait pas en compte la moyenne imposée (valeurs arbitraires en conditions limites et avec A1 : valeur initiale imposée):
HTML:
=SI(ET(A1>=1;F4<10);A1+ALEA()*ALEA.ENTRE.BORNES(-10;10)/10;SI(A1=0;ALEA()*ALEA.ENTRE.BORNES(0;10)/10;SI(ET(A1>0;A1<1);A1+ALEA()*ALEA.ENTRE.BORNES(-10;10)/10;SI(A1>=10;A1-ALEA()*ALEA.ENTRE.BORNES(0;10)/10;SI(A1<0;0;0)))))
J'ai insérer votre fonction dans une macro avec une simple boucle "For" comme suit :
Code:
Sub profil_vent()
Dim col As Integer
col = 1

'Upgrade
    Application.ScreenUpdating = False  'speed up macro execution
    Application.EnableEvents = False    'turn off other macros for now
    Application.DisplayAlerts = False   'turn off system messages for now

For i = 1 To 20
    Cells(i, col) = DistrQsN(Rnd, 2, 4)
Next
End Sub
Cependant, la moyenne des valeurs obtenues est différente de 2, un écart > à 15 entre 2 valeurs consécutives et j'obtiens des valeurs négatives. Il faudrait par exemple que dès que la valeur devient < 0, on renvoie 0. De plus, j'ai tenté de le faire sur 10000 itérations mais la procédure prend alors plus de 30 minutes...
Peut-être ai-je mal utilisé la fonction ?

Lust
 

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Bonjour.
C'est normal sur peu de nombres que la moyenne obtenue soit différente de celle demandée, surtout si l'écart type est grand.
Vous devriez demander des valeurs avec une moyenne de 0, les additionner les unes à la suite des autres, et prendre une exponentielle des résultats.
Pour réduire les temps, évitez d'écrire 10000 fois dans une cellule une valeur: c'est 10000 fois plus long que de verser une seule fois dans 10000 cellules un tableau.
 

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

Je vais tenter ça ;)

Par contre :
Pour réduire les temps, évitez d'écrire 10000 fois dans une cellule une valeur: c'est 10000 fois plus long que de verser une seule fois dans 10000 cellules un tableau.
Je ne vois pas comment le faire. Pour moi la boucle "For" était toute disposée à ce problème mais visiblement non. Une astuce ?

Lust
 

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Pour déclarer un tableau d'une colonne de 10000 lignes: Dim T(1 To 10000, 1 To 1)
Pour déclarer un tableau dynamique: Dim T()
Pour le retailler au nombre de ligne contenu dans une variable LMax: Redim T(1 to LMax, 1 To 1)
Un élément c'est: T(L, 1)
Oui dans un For L = 1 To 10000 aussi.
 

Modeste geedee

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Bonsour®
j'arrive à obtenir une variation progressive mais pas à considérer la moyenne.
Je pense qu'un codage en VBA peut résoudre cela mais je suis novice en VBA ;)
novice en météo également ... :rolleyes:

Considerer plutôt le terme de médiane, c'est dire la valeur pour laquelle il y a eu sur la période examinée autant de valeurs supérieures que de valeurs inférieures.
Les "moyennes mensuelles" ne prennent pas en comptes les "incidents éoliens" non cycliques...(effet de lissage non pas sur un intervalle mensuel glissant, mais sur des périodes saisonnières respectivement équivalentes passées)

ex : la moyenne mensuelle ne peut être représentative d'une période saisonnièrement calme(2-3 beaufort) ou il n' aurait eu qu'une seul jour de tempête(9-10 beaufort).
 

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

Merci pour vos réponses et remarques.

Effectivement Modeste geedee, je ne prends pas en compte (pour le moment) les incidents éoliens ;)

J'ai un soucis quand au remplissage de mon tableau : je voudrai remplir un tableau de 10 000 lignes et de 10 colonnes MAIS dont chacune des colonnes serait séparée par 3 autres colonnes. Pour résumer, 10 000 lignes remplies toutes les 4 colonnes. De plus, je voudrai lancer le programme en fonction de la cellule sélectionnée dans Excel.
Voilà en code (qui est visiblement FAUX) ce que je voudrai faire :

Code:
Dim T(ActiveCell.Row To ActiveCell.Row + 10000, 1 To 41 Step 4)
Je galère... :confused:
 
Dernière édition par un modérateur:

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Bonjour.
Non, on ne peut pas dimensionner un tableau avec des indices variant d'un pas différent de 1.
Mais s'il s'agit de vider les cellules entre les dites colonnes on peut travailler, avec un tableau les englobant toutes, seulement sur les indices de colonnes désirés.
 

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

Ah ok dommage.
Les colonnes "intervalles" contiennent déjà des données, donc je ne voudrai pas supprimer les valeurs de ces colonnes lors du remplissage des colonnes désirées. Je vais encore tenter quelques lignes de code, sinon je le ferai manuellement colonne par colonne à l'aide de votre fonction "DistrQsN".

Merci encore :eek:
 

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

S'il n'y a pas de formule, mais seulement des valeurs on peut encore récupérer le tableau au lieu de le redimensionner.
Si ce ne sont que des formules identiques on peut les installer après déchargement.
 

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

En fait, mon tableau est construit (toutes les 4 colonnes) comme suit :
1ère colonne = données | 2ème colonne = formule (= f(1ère colonne)) | 3ème colonne = données (celle que je veux créer à partir de la moyenne) | 4ème colonne = formule (= f(3ème colonne))
 

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Joignez un modèle de votre classeur.
Peut être auriez vous intérêt à calculer aussi ce qui est actuellement calculé par des formules, ou au contraire tout faire par formules, je ne sais pas.
 
Dernière édition:

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

Voilà une rapide ébauche. J'ai enlevé toutes les formules (seules les colonnes colorées m'intéressent) :)
Les formules que j'ai déjà utilisé n'étaient pas issues de VBA mais étaient écrites en tant que fonction dans Excel (ex : =SI(..,..,..,) ...)
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Re : Générer des nombres aléatoires qui se suivent

Les formules m'auraient intéressé. Là je n'ai pas assez d'éléments pour vous dire comment fabriquer au mieux le tableau.
Je ne peux pas mettre par macro des formules que je ne connais pas, ni voir s'il vaudrait mieux en calculer les valeurs.
Le mieux serait que vous l'écriviez comme convenu, et je vous dirai si on peut éventuellement l'améliorer.

Remarque: La valeur de la propriété Value d'une expression Range représentant plusieurs cellule est un tableau, toujours à 2 dimensions, même s'il n'y a qu'une ligne ou 1 colonne, d'éléments de type Variant dont les 1er indices de ligne et de colonne sont toujours 1, quelle que soit l'emplacement de sa cellule de départ. Il vaut donc mieux qu'il soit aussi basé 1, tel qu'on le récupérerait de la plage, s'il est destiné à être affecté à sa propriété Value.
 
Dernière édition:

Lust

XLDnaute Nouveau
Re : Générer des nombres aléatoires qui se suivent

Bonjour,

J'ai retravaillé le sujet et je pense avoir réussi à obtenir ce que je voulais (faire un décalage de 4 colonnes entre 2 itérations + conservation des formules :cool: ). Pour les intéressés ;) :

Code:
Sub profil_vent()
Dim Tabvent As Variant, cmpt1 As Long, cmpt2 As Integer

ecart=1000

Tabvent = Range(ActiveCell, ActiveCell.Offset(ecart, 41)).Formula

For i = 1 To 10
    moy = Sheets("Vitesse vent").Range("B" & i + 1).Value
    cmpt2 = (4 * i) 
    For cmpt1 = LBound(Tabvent, 1) To UBound(Tabvent, 1)
        Tabvent(cmpt1, cmpt2) = DistrQsN(Rnd, moy, 1.2)
        If Tabvent(cmpt1, cmpt2) < 0 Then
            Tabvent(cmpt1, cmpt2) = 0
        End If
    Next cmpt1
Next i

Range(ActiveCell, ActiveCell.Offset(ecart, 41)).Formula = Tabvent
End Sub
Un grand merci à vous Dranreb pour le temps consacré et votre fonction "DistrQsN" :D

Lust
 
Dernière édition par un modérateur:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas