# Gaussche Normalverteilung in einem beliebigen Intervall



## Scuby (8. Sep 2009)

Hallo zusammen,

die Frage klingt etwas seltsam, allerdings komme ich einfach nicht weiter bei dem Problem... Ich hoffe ihr könnt mir da weiterhelfen und bedanke mich jetzt schon mal für eure Hilfe...

Also es geht um folgendes:

Ich habe einen Stellplatz auf den max. 17 Körbe passe die im nachhinein wieder von einem Fahrzeug beseitigt werden. Um zu sehen wie schnell die Beseitigung dauert, habe ich eine Simulation geschriebe die wunderbar funktioniert. Jetzt ist allerdings das Problem, wenn ich den Platz mit zufälligen Zahlen füllen lasse über nextInt in einem Intervall von 0-17 ist dies nicht Realitätsnah, denn es ist zwingend erforderlich, das der Platz nach der Gausschen Normalverteilung befüllt wird. jetzt habe ich mit überlegt aus Random nextGaussian zu nehmen, allerdings ist hier das Problem, das nur Zahlen von -2 bis 2 ausgegeben werden, also im Intervall -2,2 ich möchte aber folgendes Intervall 0,17 ohne ausbrüche ins Negative sowie über 17. Da ich leider kein Intervall bei nextGaussian angeben kann weiß ich jetzt einfach nicht mehr weiter und würde mich über eure Hilfe sehr freuen...

Scuby


----------



## Illuvatar (8. Sep 2009)

Das Problem ist, dass 





> das nur Zahlen von -2 bis 2 ausgegeben werden


 nicht stimmt.
Eine Gaussverteilung nähert sich für große/kleine Argumente zwar relativ schnell asymptotisch der 0, allerdings hast du keine Garantie, dass nie eine 10000 erscheinen wird. Du musst jetzt entscheiden was du willst - am besten setzt du dir eine linke und rechte Grenze (z.B. bei -5 und +5) und rechnest alles was aus diesem Intervall fällt eben z.B. dem linken oder rechten Rand zu.


----------



## Scuby (8. Sep 2009)

Ja ok, das wäre eine Möglichkeit, also lasse ich einfach alles unter 0 und über 17 wegfallen, aber wie bekomme ich das mit nextGaussian hin? Hast du vllt. einen Ansatz für mich?


----------



## Illuvatar (8. Sep 2009)

Zum Beispiel:


```
import java.util.*;

public class GaussTest
{
  Random r = new Random();
  public int yourAdCouldBeHere()
  {
    double d = r.nextGaussian() + 9.5;
    if (d < 1) d = 1;
    if (d >= 19) d = 18;
    return (int)d;
  }
  public static void main(String[] args)
  {
    GaussTest t = new GaussTest();
    for (int i = 0; i < 100; i++)
      System.out.println(t.yourAdCouldBeHere());
  }
}
```

So kommen aber Werte weit außen praktisch nie vor... das darfst du jetzt aber alleine lösen 

Edit: Oh, und es geht aus Versehen bis 18... dafür gilt das Gleiche


----------



## Scuby (8. Sep 2009)

Alles klar vielen Dank für die Hilfe... Werde mal sehen ob ich das bei mir so umgesetzt bekomme und das dann auch für ca. 100000000 Fälle...

LG
Scuby


----------



## Guybrush Threepwood (8. Sep 2009)

Nun ja, die Implementation in Random legt eine Normalverteilung mit m = 0.0 und sd = 1.0 zugrunde. Innerhalb von +/- 2 liegen 95.5 % aller Werte. Wenn die Verteilung anders aussehen soll, dann muss die Skala mittels der frei wählbaren Angaben zum Mittelwert und Standardabweichung transformiert werden, und zwar nach dem Schema: 

Wert = Mittelwert + random.nextGaussian()*Standardabweichung

Die Standardabweichung muss also zusätzlich berücksichtigt, und Werte außerhalb 0 und 17 gefangen werden.Sinnvoll wäre die Setzung des Mittelwerts auf 9.5 (wie in IlluvatarsPost) und zusätzlich die Standardabweichung auf 3 oder 4 zu setzen.


----------

