Mit nextGaussian() positive Zahlen erzeugen?

Bitte aktiviere JavaScript!
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.
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Was spricht dagegen, so lange Zufallswerte zu erzeugen, bis sie im gewünschten Bereich liegen?
 
Mal ein Vergleich der Lozenzkurven, soweit ich diese verstanden habe, einmal per Halbnormalverteilung (rot = Absolutwert) und einmal per "Normalverteilung" (blau = verwerfen negativer Werte)

lorenz.png.
 
Das ist ja der Mist :)

Man hat einen Erwartungswert und die Standardabweichung. Ca. 69 % der normalverteilten Werte liegen im Bereich des Erwartungswerts +/- Standardabweichung. Verdoppelt man die Standardabweichung, liegen etwa 95 % der Werte in dem sich ergebenden Bereich. Man kann das Intervall aber beliebig groß wählen, man wird nie 100 % erreichen.
 
Man kann das Intervall aber beliebig groß wählen, man wird nie 100 % erreichen.
Mathe war schon immer meine schwache Seite, aber der Bereich kann ja nicht unendlich sein, weil er durch Double sowieso eingeschränkt wird. Da der TO nur positive Zahlen möchte, schränkt er diesen Bereich nochmal ein. Es ist also nur eine Frage der Anwendung, ob es ausreichend ist, wenn er den Erwartungswert in die Mitte des positiven Bereiches verschiebt.

Oder lieg ich da jetzt ganz falsch?
 
Zuletzt bearbeitet:
Ich könnte mir vorstellen, dass sich ein Verfahren finden lässt, das die in der Praxis geltenden Grenzen ausnutzt. Einfach den Erwartungswert nach Double.MAX_VALUE/2 zu verschieben, funktioniert allerdings nicht: aufgrund der Präzision von double würdest Du (fast) immer den gleichen Wert erhalten, nämlich Double.MAX_VALUE/2.
 
Nö, s. Kommentar 12: in knapp 70 % der Fälle erhältst Du eine Zufallszahl, die zwischen -1 und 1 liegt.
 
Java:
import java.util.Random;

public class Gaussian {
    public static void main(String[] args) {
        Random rand = new Random(1L);

        int count = 0;
        do {
            double value;
            do {
                value = rand.nextGaussian();
            } while (Math.abs(value) <= 1.0);
            System.out.println(value);
            count++;
        } while (count < 10);
    }
}
liefert

Code:
1.561581040188955
-1.0912278829447088
-1.1182832102556484
-1.6583217791337177
-1.8821643777572246
-1.160868794354026
2.8307323206471837
-1.3604870442090895
-1.1629624729268742
-1.3049338775280348
 
Dann setzte ich auf das falsche Pferd...
Aber was wäre damit:
Java:
public static double ng(double a, double b) {
	double eps = 0.001;
	if (!(a + eps < b)) {
		throw new IllegalArgumentException("a must be lower than b");
	}
	Random r = new Random();
	double g = r.nextGaussian();
	while (g < a || g > b) {
		g = r.nextGaussian();
	}
	return g;
}

public static void main(String[] args) {
	for (int i = 0; i < 20; i++) {
		System.out.println(ng(0.10, 0.11));
	}
}

Bei ng(10, 11) hält es allerdings nicht an...
 
Sollte aber klappen, den Erwartungswert in die Mitte des gewünschten Intervalls zu "schieben" und die Standardabweichung anzupassen (zB 1/6 der Interfvallgröße). Wenn man alles außerhalb liegende abschneidet, verliert man ein paar Promille (je nach Standardabweichung), aber nutzen lassen sollte es sich trotzdem.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben