Normalverteilte zufallszahlen mit Mittelwert und Streuung
Hallo Leute,
ich hab ein Problem und finde nix richtiges im Netz. :(
Ich möchte mittels Java oder C# normalverteilte Zufallszahlen mit vorgegebenem Erwartungswert und Streuung generieren. Ich hatte es erst im C# versucht aber da sah es noch schlechter aus. Java bietet ja die next.gaussian() die zufallszahlen zw. mit Erwartungswert 0 und streuung 1 generiert. Aber leider weiß ich nicht wie ich das anpassen kann, dass es mir zufallszahlen mit meinem Erwartungswert liefert. Irgendeine Streckung oder sowas....
Ideen? Ich bin dankbar für alles! :)
Lg
jojo
Antwort schreiben
Antwort 1 von Jaja vom 30.10.2019, 10:18 Options
du müsstest dir wohl selbst eine entspr. funktion schreiben - mir ist zumindest keine andere lösung bekannt.
aber ich hab auch nicht die tolle ahnung ;)
Allgemein ist die dichte der normalverteilung:
f(x)={e^[-0.5((x-erwartungswert)/standardabweichung)²]}/{standardabweichung *sqrt[2*PI]}
Antwort 2 von Jaja vom 30.10.2019, 10:21 Options
ach so:
in die dichtefunktion f(x) kannst du dann für x eine gleichverteilte zufallszahl einsetzen. so einen zufallszahlengenerator gibts ja in jeder prog.sprache...
Antwort 3 von kloma vom 30.10.2019, 10:40 Options
Zitat:
Ich möchte mittels Java oder C# normalverteilte Zufallszahlen mit vorgegebenem Erwartungswert und Streuung generieren.
wenn es auch perl sein dürfte, da gäb es das schon fertig (
cpan-module).
Antwort 4 von zufall vom 30.10.2019, 10:58 Options
Thx Jaja, dass versuch ich auch die ganze Zeit aber das bekomme ich irgendwie nicht gebacken! :( Ich dachte da genau an sowas wie von kloma, nur halt ich c# oder Java. Mich jetzt noch mit perl zu befassen hab ich keine Lust! :P
Noch andere Ideen?
Antwort 5 von zufall vom 30.10.2019, 11:11 Options
habs mal versucht..
double StndAbw;
double mean;
double X;
double d1;
double d2;
double d3;
double d4;
double d5;
double z;
StndAbw =3;
mean = 50;
Random zZ = new Random();
System.out.println("Start...");
for(int i=0;i<100;i++)
{
z=zZ.nextDouble();
d1=(z-mean)/StndAbw;
d2=Math.pow(d1,2);
d3=(-0.5*d2);
d4=Math.exp(d3);
d5=(StndAbw*Math.sqrt(2*Math.PI));
X=d4/d5;
//X = (zZ.nextGaussian()*9)+1;
System.out.println(X);
}
liefert leider nur müll ...
Start...
9.291629843605963E-61
3.069131144639081E-61
4.306559230904052E-61
1.1730194527309215E-60
1.3387533021098374E-60
3.042784476895542E-61
8.687777941961444E-62
1.5212242315196183E-59
3.277905612121527E-61
5.0231841912835665E-61
4.8191935518151115E-60
1.766087896559868E-60
7.452137708084323E-60
1.4837860841935484E-61
Antwort 6 von Jaja vom 30.10.2019, 11:17 Options
...dein erwartungswert muss zwischen 0 und 1 liegen, da die zufallszahlen doch auch nur zwischen 0 und 1 generiert werden, oder bei java / c# nicht?
du musst anschließend f(x) mit einem faktor multiplizieren.
z.b. für Zz zwischen 0 und 5 = f(x) *5,
oder Zz 0 ... 155 = f(x)*155
Antwort 7 von Jaja vom 30.10.2019, 11:21 Options
... du kannst NICHT gleich die zZ "z" des random generators multiplizieren, da die dichtefunktion auch nur für den wertebereich 0..1 definiert ist - du kannst nur das ergebniss durch multiplikation im wertebereich erweitern...
Antwort 8 von Jaja vom 30.10.2019, 11:28 Options
ach ja:
deine standartabweichung setze bitte auch auf einen wert zwischen 0 und 1 ;)