rozkład wykładniczy, gauss

0

Cześć, nie mogę się uporać z pewnym problemem, nie do końca też wiedziałem jak poprawnie zatytułować wątek.
Chodzi o to że chciałbym tablicę o zadanej długości wypełnić 0 lub 1 używając generatora liczb losowych, w taki sposób, aby prawdopodobieństwo tego że wypadnie jedynka było większe bliżej środka tablicy.
Próbowałem jakimiś wzorami Gaussa to robić, ale nie bardzo mi wychodzi. Tzn szybko próg prawdopodobieństwa zostaje przekroczony i wychodzi mniej więcej coś takiego: [0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0]
Wstawię fragment kodu w języku C# może ktoś coś podpowie co do poprawki, albo poda jakiś działający wzór

 
            int start = (mw / 2) - (sourceSize / 2);//mw to długość tablicy, sourceSize to obszar tablicy od środka który chcę wypełniać
            int end = (mw / 2) + (sourceSize / 2);
                double z = ((end - start) / 2.0);
                double k = 0;
                for (int x = start; x < end; x++) {
                    double r = rand.NextDouble();//losowa liczba od 0 do 1
                    double l = z - Math.Abs(z - k);
                    double sigma = (sourceSize / (z*1.5));//przy tym współczynniku ustawionym na 1.5 jest najlepiej chociaż i tak, źle
                    double m = 2 * (sigma * sigma);
                    double h = Math.Exp((-l) / m);
                    map[x].Stuff = (h <= r) ? 1 : 0;
                    k++;
                }
1

Jeśli chcesz otrzymać rozkład Gaussa to z rozkładu jednorodnego [0, 1] możesz to zrobić za pomocą transformacji Boxa-Mullera: http://pl.wikipedia.org/wiki/Transformacja_Boxa-Mullera

0

okej właśnie transformacji Boxa-Mullera wspominał prowadzący, ale wyleciało mi z głowy, poczytam i powinno pomóc chociaż jakieś skomplikowane te wzory się wydają.

0

to nawiązując do tego linku powyżej, co mi daje wyliczenie z1 i z2? Bo jakoś nie bardzo rozumiem co potem z tymi zmiennymi zrobić

0

Działa to tak. Losujesz sobie x1 i x2 rozkładem jednorodnym. Następnie liczysz (np tylko) z1 dla Twoich x1 i x2. Otrzymane z1 jest z rozkładu Gaussa, zauważysz to gdy te obliczenia wykonasz w pętli wiele razy i narysujesz sobie jakiś wykres czy coś takiego.

0

hmm to ja już chyba nie myślę z powodu późnej godziny, albo w ogóle nie rozumiem tego algorytmu. Wyszło coś takiego:

            Random rand = new Random();

            for (int i = 0; i < 100; i++) {
                double u1 = rand.NextDouble();//od 0 do 1
                double u2 = rand.NextDouble();
                double z1 = Math.Sqrt(-2 * Math.Log(u1)) * Math.Cos(2 * Math.PI * u2);
                System.Console.WriteLine(z1);
            }

Wydaje mi się, że żeby to dobrze działało to kolejne wyniki muszą być jakoś od siebie zależne, bo tak o wrzucenie w pętlę to chyba bez sensu. Jakiś chociaż parametr powinien być wg mnie jeszcze jeden.

0

No wydaje się dobrze napisane, sam to robiłem nie tak dawno i rysowałem wykres i było okej. Ten wzór jest dla parametrów mi = 0 i sigma² = 1.

0

Tam chyba nie powinieneś tego mnożyć dla odcinka, bo to jest 1 wymiar, a nie koło.

0

Okej już działa;) Dzięki!

0

A nie prościej użyć metody nextGaussian?

1 użytkowników online, w tym zalogowanych: 0, gości: 1