Générer nombre aléatoires avec base de données (connaissant donc moyenne et écar [Résolu]

Signaler
Messages postés
2
Date d'inscription
samedi 1 novembre 2008
Statut
Membre
Dernière intervention
16 février 2009
-
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
-
Slt à tous! :)

Voilà je vous explique mon problème.
J'ai une colonne dans mon fichier Excel représentant des relevés de températures sur 8760h (1 année civile..du 01 Janvier au 31 Décembre).
J'obtiens une moyenne m et un écart-type e pour cette colonne.

J'ai utilisé un logiciel de lissage (FindGraph) qui me donne une T°lissée = Tmoyenne - Ampli*cos(w*t - phi)

Connaissant m et e, je souhaiterai avoir en fait comme équation pour ma température :
T° = T°lissée + Nb aléatoire

Le Nb aléatoire devant respecter les statistiques m et e.

Celà est-il possible ou alors je m'enflamme pour rien :).
Si oui, quels instructions dois-je utiliser

Merci à vous!!

2 réponses

Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour Adrien

Le thème n'est pas vb.net, mais VBA. Penses-y la prochaine fois.

Voici le programme VBA/Excel te permettant de générer une série de nombre entiers respectant une moyenne et un écart-type fixés ou plutôt espérés par l'utilisateur (mon programme tolèrant une erreur absolue de +/- 0.5 pour la moyenne et pour l'écart-type).

Il génère d'abord une série aléatoire grossière, dont il corrige ensuite progressivement la moyenne et l'écart-type, en translatant la population (correction de la moyenne), et en dispersant/concentrant les nombres autour de la moyenne (correction de l'écart-type).

Je ne suis pas certain que cela corresponde pile-poil à ton attente, car tes explications sur le lissage sont un peu obscures pour moi (je ne suis pas tombé dans la marmite des maths étant petit, loin de là), alors j'attends tes remarques.

    Option Explicit
    Type statistiques
        moyenne As Double
        ecart_type As Double
    End Type
    Dim nombre_echantillons As Integer
    Dim echantillons() As Long
    Dim espere As statistiques
    Dim obtenu As statistiques



Sub principale()

' procédure principale, fixant les paramètres et générant une population

' definition des parametres de l'utilisateur
    nombre_echantillons = 8760
    espere.moyenne = 40
    espere.ecart_type = 15
' cree une population proche des parametres esperes
    creer_population
' affiche les parametres obtenus
    Range("C2").Value = "moyenne : " & Round(obtenu.moyenne, 1)
    Range("C4").Value = "ecart type : " & Round(obtenu.ecart_type, 1)
End Sub



Function creer_population()

' cree une population correspondant approximativement à la moyenne et l'écart-type
' et corrige progressivement l' approximation. La population est ensuite chargée dans
' la colonne A de la feuille active

    Dim max As Long
    Dim min As Long
    Dim echantillon As Long
    Dim i As Integer
    Dim statistiques As statistiques
    ReDim echantillons(nombre_echantillons - 1)
    max = espere.moyenne + espere.ecart_type
    min = espere.moyenne - espere.ecart_type
    Randomize Timer
    Cells.Clear

' generation d'une population aléatoire approximative

    For i = 1 To nombre_echantillons
        echantillon = Int((max - min + 1) * Rnd + min)
        echantillons(i - 1) = echantillon
    Next

' correction de l'approximation
' manipulation de la population, jusqu'à obtention d'une erreur maximale de +/- 0.5
' par rapport à la moyenne et l'écart-type espérés
'

    Do
        statistiques = stats
        If Round(statistiques.moyenne, 0) <> espere.moyenne Then _
            corriger_moyenne CDbl(Round(statistiques.moyenne, 0) - espere.moyenne)
        If Round(statistiques.ecart_type, 0) <> espere.ecart_type Then _
            corriger_ecart_type (statistiques.ecart_type - espere.ecart_type)
    Loop Until Round(statistiques.moyenne, 0) = espere.moyenne And _
        Round(statistiques.ecart_type, 0) = espere.ecart_type
' affichage du resultat
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        ActiveSheet.Cells(i, 1).Value = echantillon
    Next
    obtenu.moyenne = statistiques.moyenne
    obtenu.ecart_type = statistiques.ecart_type
End Function



Sub corriger_moyenne(correction As Double)



' corrige l'erreur sur la moyenne par une translation de la population



    Dim i As Integer
    Dim echantillon As Long
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        echantillon = CDbl(echantillon - correction)
        echantillons(i - 1) = echantillon
    Next
End Sub



Sub corriger_ecart_type(correction As Double)



' corrige l'erreur sur l'écart-type par une dispersion ou concentration de la population autour de la moyenne



    Dim i As Integer
    Dim echantillon As Long
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        If echantillon < espere.moyenne Then
            If correction < 0 Then
                echantillon = echantillon + correction
            Else
                echantillon = echantillon - correction
            End If
        ElseIf echantillon > espere.moyenne Then
            If correction < 0 Then
                echantillon = echantillon - correction
            Else
                echantillon = echantillon + correction
            End If
        End If
        echantillons(i - 1) = CDbl(echantillon)
    Next
End Sub



Function stats() As statistiques

' calcule la moyenne et l'écart-type du tableau echantillons

    Dim i As Integer
    Dim echantillon As Double
    Dim sommecarresX As Double
    Dim sommeX As Double
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        sommecarresX = sommecarresX + echantillon ^ 2
        sommeX = sommeX + echantillon
    Next
    stats.moyenne = sommeX / nombre_echantillons
    stats.ecart_type = Sqr((nombre_echantillons * sommecarresX - sommeX ^ 2) / (nombre_echantillons ^ 2))
End Function


Amicalement
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Adrien

J'ai apporté diverses modifications au code ci-dessus. En particulier, la moyenne et l'écart-type sont égaux à m et e à la 10e décimale près. Les nombres sont des réels en double précision.



    Option Explicit
    Type statistiques
        moyenne As Double
        ecart_type As Double
    End Type
    Dim nombre_echantillons As Integer
    Dim echantillons() As Double
    Dim critere As statistiques
    Dim resultat As statistiques
    Dim precision As Integer



Sub principale()



' procédure principale, fixant les paramètres et générant une population




' criteres imposés par l'utilisateur



    precision = 10 ' precision requise pour la moyenne et l'ecart-type (nb de chiffres apres la virgule)
    nombre_echantillons = 8760
    critere.moyenne = 40
    critere.ecart_type = 15

' cree une serie de nombres conforme aux criteres

    creer_population

' affiche les parametres resultats

    Range("C2").Value = "moyenne : " & Round(resultat.moyenne, 1)
    Range("C4").Value = "ecart type : " & Round(resultat.ecart_type, 1)

End Sub



Function creer_population()



' cree une population correspondant approximativement à la moyenne et l'écart-type
' et corrige progressivement l' approximation. La population est ensuite chargée dans
' la colonne A de la feuille active



    Dim max As Double
    Dim min As Double
    Dim echantillon As Double
    Dim i As Integer
    ReDim echantillons(nombre_echantillons - 1)
    max = critere.moyenne + critere.ecart_type
    min = critere.moyenne - critere.ecart_type
    Randomize Timer
    Cells.Clear



' generation d'une population aléatoire approximative



    For i = 1 To nombre_echantillons
        echantillon = (max - min + 1) * Rnd + min
        echantillons(i - 1) = echantillon
    Next




' correction de l'approximation.
' Redistribution des nombres en vue d'obtenir la moyenne et l'écart-type recherchés
' avec une précision de 10 chiffres après la virgule


    Do
        resultat = calculer_stats
        If Round(resultat.moyenne, precision) <> critere.moyenne Then _
            corriger_moyenne (Round(resultat.moyenne, precision) - critere.moyenne)
        If Round(resultat.ecart_type, precision) <> critere.ecart_type Then _
            corriger_ecart_type (resultat.ecart_type - critere.ecart_type)
    Loop Until Round(resultat.moyenne, precision) = critere.moyenne And _
        Round(resultat.ecart_type, precision) = critere.ecart_type

' affichage du resultat

    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        ActiveSheet.Cells(i, 1).Value = echantillon
    Next

End Function



Sub corriger_moyenne(correction As Double)



' corrige l'erreur sur la moyenne par une translation de la population



    Dim i As Integer
    Dim echantillon As Double
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        echantillon = echantillon - correction
        echantillons(i - 1) = echantillon
    Next

End Sub



Sub corriger_ecart_type(correction As Double)



' corrige l'erreur sur l'écart-type par une dispersion ou concentration de la population autour de la moyenne



    Dim i As Integer
    Dim echantillon As Double
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        If echantillon < critere.moyenne Then
            echantillon = echantillon + correction * (critere.moyenne - echantillon) / critere.ecart_type
        ElseIf echantillon > critere.moyenne Then
            echantillon = echantillon - correction * (echantillon - critere.moyenne) / critere.ecart_type
        End If
        echantillons(i - 1) = echantillon
    Next

End Sub



Function calculer_stats() As statistiques



' calcule la moyenne et l'écart-type du tableau echantillons



    Dim i As Integer
    Dim echantillon As Double
    Dim sommecarresX As Double
    Dim sommeX As Double
    For i = 1 To nombre_echantillons
        echantillon = echantillons(i - 1)
        sommecarresX = sommecarresX + echantillon ^ 2
        sommeX = sommeX + echantillon
    Next
    calculer_stats.moyenne = sommeX / nombre_echantillons
    calculer_stats.ecart_type = Sqr((nombre_echantillons * sommecarresX - sommeX ^ 2) / (nombre_echantillons ^ 2))

End Function






 


Amicalement