Generowanie liczb o rozkładzie normalnym z parametrami

Generowanie liczb o rozkładzie normalnym z parametrami
DR
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 4 lata
  • Postów:37
0

Witam,
potrzebuję funkcję która będzie mi generowała liczby pseudolosowe o rozkładzie normalnym, tak abym mógł podać swoje parametry średniej i odchylenia. Niestety metoda nextGaussian nie przyjmuje żadnych argumentów. Nie mam pojęcia jak się za to zabrać.

Pozdrawiam

Jaca777
  • Rejestracja:około 9 lat
  • Ostatnio:11 miesięcy
2

nextGaussian zwraca liczby losowe o średniej 0 i odchyleniu 1. Aby zmienić średnią dodajesz, a aby zmienić odchylenie mnożysz.
Czyli przykładowo:
r.nextGaussian() * 100 + 500;
Oznacza rozkład o średniej 500 i odchyleniu 100.

edytowany 2x, ostatnio: Jaca777
DR
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 4 lata
  • Postów:37
0

aaa... Dzieki za przydatne info! A ja rozkminiałem metode box'a=mullera, ale nie wiem czy to jest dobrze.

Kopiuj
public double NormalDistribution(double mi, double sigma)
    {      
        double u1 = generatorExponential.nextDouble();
        double u2 = generatorExponential.nextDouble();
        
        double z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2);
        double z2 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);

        double x1 = mi + z1 * sigma;
        double x2 = mi + z2 * sigma;

        return x2;
    } 
Jaca777
W Javie konwencja zakłada nazywanie metod z małej litery (normalDistribution). Najlepiej do takich rzeczy się stosować - ułatwiasz życie innym i sobie.
Jaca777
  • Rejestracja:około 9 lat
  • Ostatnio:11 miesięcy
1

Po co samemu to implementujesz? Dokładnie tę metodę wykorzystuje Random.nextGaussian:

Kopiuj
         
if (haveNextNextGaussian) {
            haveNextNextGaussian = false;
            return nextNextGaussian;
        } else {
            double v1, v2, s;
            do {
                v1 = 2 * nextDouble() - 1; // between -1 and 1
                v2 = 2 * nextDouble() - 1; // between -1 and 1
                s = v1 * v1 + v2 * v2;
            } while (s >= 1 || s == 0);
            double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s);
            nextNextGaussian = v2 * multiplier;
            haveNextNextGaussian = true;
            return v1 * multiplier;
        }
 } 

Wystarczy, że zrobisz sobie metodę:

Kopiuj
    public static double nextGaussian(double mean, double deviation){
        return random.nextGaussian() * deviation + mean;
    }
edytowany 2x, ostatnio: Jaca777

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.