# Mit nextGaussian() positive Zahlen erzeugen?



## slitec (6. Juni 2019)

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.


----------



## zerix (7. Juni 2019)

Hallo,

einfach mal so eine Idee, warum rechnest du nicht einfach * -1?

Viele Grüße
Sascha


----------



## ComFreek (7. Juni 2019)

Ist dir bewusst, dass du dadurch die Zufallsverteilung fundamental änderst? Die Zahlen werden nicht mehr normalverteilt sein.


----------



## Technipion (7. Juni 2019)

Gaußverteilte Zufallszahlen aber nur positiv? 

Suchst du vielleicht eher nach einer Poisson-Verteilung?


----------



## zerix (7. Juni 2019)

ComFreek hat gesagt.:


> Ist dir bewusst, dass du dadurch die Zufallsverteilung fundamental änderst? Die Zahlen werden nicht mehr normalverteilt sein.


Aber wenn er es doch so möchte


----------



## slitec (7. Juni 2019)

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.


----------



## ComFreek (7. Juni 2019)

zerix hat gesagt.:


> Aber wenn er es doch so möchte


Anscheinend will OP doch eine Normalverteilung 



slitec hat gesagt.:


> normalverteilte positive Zahlen zu erzeugen.


Könntest du genauer spezifieren, was du meinst? Wie sieht das mathematisch aus?
(Durch Ändern des Vorzeichens oder Rejection Sampling erreichst du insbesondere keine Normalverteilung mehr.)


----------



## Technipion (8. Juni 2019)

ComFreek hat gesagt.:


> Anscheinend will OP doch eine Normalverteilung





slitec hat gesagt.:


> 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.



slitec hat gesagt.:


> 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:

```
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:

```
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


----------

