2009-10-07 33 views
5

Potrzebuję generatora liczb losowych, który wybiera liczby w określonym zakresie z programowalną średnią.Niejednorodna implementacja generatora liczb losowych?

Na przykład, muszę odebrać numery od 2 do 14 i muszę średnią z liczb losowych być 5.

używam generatorów liczb losowych dużo. Zazwyczaj potrzebuję jednolitej dystrybucji.

Nie wiem nawet, jak nazwać ten rodzaj dystrybucji.

Dziękujemy za udzieloną pomoc lub wgląd.

+9

Czy jesteś pewien, że podałeś wystarczająco dużo informacji na temat dystrybucji? Wierzę, że średnia wartość to za mało. Rozważmy następujący przykład: załóżmy, że generujemy losowe liczby z '{0, 1, 2}' z 1 średnią. Teraz spójrz na te dwa generatory: 'Generator1 (0: 40%, 1: 20%, 2: 40%)', 'Generator2 (0: 10%, 1: 80%, 2: 10%)'. W przypadku obu z nich średni wynik byłby 1. –

+1

A w pobliżu duplikatu: http://stackoverflow.com/questions/977354/generating-non-uniform-random-numbers. A nie płaskie repliki pseudolosowe są standardowym tematem, który był adresowany więcej niż jeden raz na SO. Podaj więcej informacji i wskażemy ci właściwy kierunek. – dmckee

+0

Jeśli dystrybucja docelowa nie jest łatwo reprezentowana przez całkowity wygląd PDF na: http://stackoverflow.com/questions/423006/how-do-i-generate-points-that-match-a-histogram – dmckee

Odpowiedz

0

My pierwszy pomysł może być:

  • generowania liczb w zakresie 0..1
  • skala zakresie -9..9 (x 0,5 X * 18)
  • przesuwnego zakres od 5 -> -4 .. 14 (dodatek 5)
  • skrócić zasięg do 2..14 (odrzucić numerów < 2)

które powinny dać ci liczb w zakresie chcesz.

+0

Ale kiedy odrzucasz liczby <2 twoja średnia przenosi się w górę z 5, prawda? –

6

Być może będziesz w stanie użyć binomial distribution, jeśli jesteś zadowolony z kształtu tego rozkładu. Ustaw n = 12 i p = 0,25. Daje to wartość od 0 do 12 ze średnią 3. Po prostu dodaj 2 do każdego wyniku, aby uzyskać zakres i średnią, której szukasz.

Edycja: Jeśli chodzi o implementację, prawdopodobnie można znaleźć bibliotekę dla wybranego języka, która obsługuje nierównomierne dystrybucje (mam written one myself for Java).

Rozkład dwumianowy może być dość łatwo przybliżony za pomocą jednolitego RNG. Po prostu wykonaj próby i zanotuj liczbę sukcesów. Więc jeśli masz n = 10 i p = 0,5, to tak jak rzucanie monetą 10 razy z rzędu i zliczanie liczby głów. Dla p = 0.25 wystarczy wygenerować równomiernie rozproszone wartości pomiędzy 0 a 3 i tylko zliczenia zerowe jako sukcesy.

Jeśli chcesz bardziej wydajną implementację, istnieje sprytny algorytm ukryty w ćwiczeniach drugiego tomu Knuth's The Art of Computer Programming.

+0

link do ["(Napisałem go sam dla Javy)."] (Https://uncommons-maths.dev.java.net/) nie jest dostępny – yishaiz

+1

@yishaiz Właśnie go zaktualizowałem. –

0

Potrzebujesz rozproszonego/ważonego generatora liczb losowych. Here's a reference na dobry początek.

3

Nie powiedziałeś, po co jesteś dystrybutorem. Jeśli chodzi o konkretny przykład, funkcja, która zapewnia jednolitą dystrybucję między 2 a 8, spełniłaby Twoje wymagania, dokładnie tak, jak je napisałeś :)

+0

Uważam, że PO ma na celu, aby wartości z 9-14 miały pewne prawdopodobieństwo, że zostaną wybrane. – fbrereto

1

Jeśli chcesz nierównomiernego rozmieszczenia losowej liczby, możesz mieć wdrożyć jakiś mapowania, np

// returns a number between 0..5 with a custom distribution 
int MyCustomDistribution() 
{ 
    int r = rand(100); // random number between 0..100 
    if (r < 10) return 1; 
    if (r < 30) return 2; 
    if (r < 42) return 3; 
    ... 
} 
1

można tworzyć niejednorodną PRNG z jednolitego jeden. Ma to sens, jak można sobie wyobrazić, biorąc jednorodny PRNG, który zwraca 0,1,2 i tworzy nowy, niejednolity PRNG, zwracając 0 dla wartości 0,1 i 1 dla wartości 2.

Jest coś więcej, jeśli zależy Ci na specyfice dystrybucji nowego, niejednolitego PRNG. Jest to objęte numerem the Wikipedia page on PRNGs, a konkretnie wymieniono Ziggurat algorithm.

Dzięki tym wskazówkom powinieneś być w stanie wyszukać jakiś kod.

1

Na podstawie Wikipedia sub-article dotyczących niejednolitych generatorów, wydaje się, że chcesz zastosować wyjście jednolitego generatora liczb pseudolosowych do rozkładu obszaru, który spełnia żądaną średnią.

0
Assign all numbers equal probabilities, 

podczas currentAverage nie równa intendedAverage (w ciągu, możliwy margines)

pickedNumber = pick one of the possible numbers (at random, uniform probability, if you pick intendedAverage pick again) 

if (pickedNumber is greater than intendedAverage and currentAverage<intendedAverage) or (pickedNumber is less than intendedAverage and currentAverage>intendedAverage) 

    increase pickedNumber's probability by delta at the expense of all others, conserving sum=100% 

else 

    decrease pickedNumber's probability by delta to the benefit of all others, conserving sum=100% 

end if 

delta=0.98*delta (the rate of decrease of delta should probably be experimented with) 

końca podczas

Powiązane problemy