Mit nextGaussian() positive Zahlen erzeugen?


slitec

Grünschnabel
#1
Hallo.

Gibt es eine Möglichkeit mit der Methode nextGaussian() positive Zahlen zu erzeugen ?
Leider muss ich die Methode nextGaussian() verwenden, da diese normalverteilte Zufallszahlen erzeugt.


Vielen Dank schon mal.
 

ComFreek

Mod | @comfreek
Moderator
#3
Ist dir bewusst, dass du dadurch die Zufallsverteilung fundamental änderst? Die Zahlen werden nicht mehr normalverteilt sein.
 

slitec

Grünschnabel
#6
Ich brauche die Zahlen für eine Lorenzkurve. Dort habe ich Probleme mit den negativen Zahlen. Deshalb suche ich eine Möglichkeit, normalverteilte positive Zahlen zu erzeugen.
 

Technipion

Erfahrenes Mitglied
#8
Anscheinend will OP doch eine Normalverteilung
Deshalb suche ich eine Möglichkeit, normalverteilte positive Zahlen zu erzeugen.
Tja, da liegt das Problem: Das ist ein Widerspruch in sich. Entweder sind die Zahlen normalverteilt oder du erzeugst Zufallszahlen mit einer Verteilung, die ausschließlich positiv ist. Aber eine Gaußverteilung wird sich immer auch über negative Zahlen erstrecken.

Ich brauche die Zahlen für eine Lorenzkurve.
Ohje. Lorentzkurven sind wahrscheinlichkeitstheoretisch gesehen aber Cauchy-Verteilungen. Es gibt Methoden um Cauchy-Verteilungen als Quotient von Normalverteilungen darzustellen. Könnte mir vorstellen, dass du das tun willst. Dann hier ein Tipp:
nextGaussian() liefert eine Normalverteilung mit µ = 0.0 und σ = 1.0. Daraus kannst du dir im Prinzip beliebige Verteilungen basteln, indem du skalierst und verschiebst. Für beliebige µ und σ kommst du so an deine (Pseudo)Zufallszahlen:
Java:
public double nextNormal(double mu, double sigma) {
    return sigma * randomGenerator.nextGaussian() + mu;
}
Ich würde allerdings davon abraten die Quotientenmethode zu benutzen (nicht nur wegen der Ungenauigkeiten bei der Division). Falls du tatsächlich hinter der Cauchy-Verteilung her bist, gibt es einen einfacheren Weg: Die Inversionsmethode.

Einfach ausgedrückt: Du versuchst eine beliebige Wahrscheinlichkeitsverteilung (in deinem Fall Cauchy) durch eine Transformation zu einer Gleichverteilung zu machen (g(x) = 1 für 0 ≤ x < 1; 0 sonst). Die Umkehrfunktion erlaubt dir dann aus gleichverteilten Zufallszahlen u die gesuchte Verteilung zu erzeugen.
Konkret heißt das hier:

Java:
public double nextCauchy() {
    return 1.0 / Math.tan( Math.PI * randomGenerator.nextDouble() );
}
Es wäre allerdings hilfreich wenn wir genauer wüssten, was du eigentlich vor hast ;)

Gruß Technipion
 

Neue Beiträge