Berechnung einer Normalverteilung



  • HALLO.

    Ich habe folgenden Code für die Berechnung einer Normalverteilung geschrieben, aber leider funktioniert es nicht. D.h., es kommen eigentlich nie Werte um die 100 zustande (also meinem 'mean'-Wert). Da der Wert 'val' relativ klein ist, werden die gesamten Werte eigentlich nie größer als 1 oder so.
    Wie muss ich den Code umwandeln, damit ich eine richtige Gauß-Verteilung mit der Standardabweichung std um den Mittelwert mean erhalte?

    int main ()
    {
        int i,anz=100000;
        double mean,std;
        vector <double> data;
    
        mean = 100;
        std = 0.5;     
    
        srand(time(0));
        for (i=0;i<anz;i++)
            data.push_back(Rauschen(mean,std));
    
        return 0;
    }
    
    double Rauschen()
    {
        double random,val;
    
        random = rand()%201;
    
        val = (random -  mean)/dev;
        val = -0.5*val*val;
    
        return std::exp(val)/(dev*std::sqrt(2*PHI));
    }
    

    Danke.
    V.K.



  • Was für eine Sprache verwendest du denn eigentlich? Unter C++ sollte das Beispiel nicht einmal compiliert werden - du verwendest die Funktion Rauschen(), bevor sie deklariert wurde und mit der falschen Anzahl Parameter. (und die von Rauschen() verwendeten Variablen 'mean' und 'dev' sind auch nirgends definiert)



  • HI CStoll,

    die Sprache sollte C++ sein. Da ich diesen Codeschnipsel schnell für den Post geschrieben habe, waren da jetzt ein paar Fehler drin. So sollte es richtig sein:

    double Rauschen(double mean, double std)
    {
        double random,val;
    
        random = rand()%201;
    
        val = (random -  mean)/std;
        val = -0.5*val*val;
    
        return std::exp(val)/(std*std::sqrt(2*PHI));
    }
    
    int main ()
    {
        int i,anz=100000;
        double mean,std;
        vector <double> data;
    
        mean = 100;
        std = 0.5;    
    
        srand(time(0));
        for (i=0;i<anz;i++)
            data.push_back(Rauschen(mean,std));
    
        return 0;
    }
    


  • Mit der Mathematik kenne ich mich nicht so gut aus, aber vermutlich passt deine Formel nicht so ganz:

    (basierend auf mean=100, std=1/2, x=sqrt(2*PHI))

    • random liegt in [0,200]
    • val=(random-mean)/std liegt in [-200,200]
    • val=-0.5*val*val liegt in [-20000,0]
    • Rauschen()=e^val/(std*sqrt(2*PHI)) liegt damit in [1e-8600*,2/x]

    Was du da hast, rechnet aus, mit welcher Wahrscheinlichkeit der von rand() gelieferte Wert bei deiner Normalverteilung vorkommt. Aber auf diese Weise kannst du keine normalverteilte Zufallsgröße erzeugen.

    * also praktisch nicht mehr messbar 😉



  • HI CStoll,

    bin gerade auf folgender Seite:
    http://c-faq.com/lib/gaussian.html

    Vielleicht finde ich ja hier was brauchbares, denn wie du schon sagst, werde ich mit dieser Formel nicht weiterkommen.

    V.K.


Anmelden zum Antworten