• Nie Znaleziono Wyników

Generatory programowe

W dokumencie Index of /rozprawy2/10812 (Stron 35-40)

Rozdział 3 Próbkowanie losowe

3.4 Generatory Liczb losowych

3.4.3 Generatory programowe

Najczęściej wykorzystywanymi generatorami losowymi są generatory oparte na teorii liczb. Odpowiednie manipulacje: mnożenie, dzielenie modulo mogą utworzyć ciągi liczb które dobrze spełniają właściwości statystyczne. Nie są one jednak w pełni losowe, stąd nazywane są generatorami pseudolosowymi. Wykorzystywane są często, ze względu na swoją stabilność i możliwość precyzyjnego określenia właściwości statystycznych. Najczęściej spotykanym rozkładem generowanych liczb losowych jest rozkład równomierny.

3.4.3.1 Generatory oparte o liczby niewymierne.

Pierwszą możliwością jest wykorzystanie własności liczb niewymiernych. Jako kolejną zwracaną przez generator liczbę przyjmuje się kolejną cyfrę rozwinięcia dziesiętnego liczby niewymiernej.

Przykładowo:

π ≈ 3,14159265358979323846264

a1 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2

Ciąg oparty na liczbach niewymiernych dobrze spełnia właściwości statystyczne. Natomiast jest bardzo trudny do zastosowania w rzeczywistym urządzeniu. Aby otrzymać kolejną cyfrę rozwinięcia dziesiętnego liczby konieczne jest dzielenie, które wymaga wszystkich poprzednich liczb zawartych w rozwinięciu dziesiętnym. Złożoność pamięciowa takiego algorytmu jest zbyt wysoka, zwłaszcza że istnieją rozwiązania szybsze i skuteczniejsze od wyżej wymienionego. W praktyce są niewykorzystywane [47].

3.4.3.2 Generatory kwadratowe von Neumana

Historycznie pierwszym generatorem jest generator kwadratowy zaproponowany przez von Neumana w 1949 roku. Używano go między innymi na komputerze ENIAC [47]. Opierał się na następującym wzorze:

(34)

Gdzie xn jest kolejną liczbą losowaną przez generator, M jest systemem w którym zapisywana jest liczba, natomiast m jest ilością cyfr generowanej liczby. oznacza funkcję podłoga czyli część całkowitą liczby[47],[48]

Opisowo można przedstawić algorytm w postaci: liczbę m cyfrową podnosimy do kwadratu a następnie usuwamy m/2 pierwszych cyfr z początku liczby oraz z jej końca otrzymując kolejną liczbę m cyfrową.

Przykład:

X0 = 1761 (X0)2 = 03101121 X1 = 03101121 = 1011

X0 = 187623 (X0)2 = 035202390129 X1 = 035202390129 = 202390

Generator ten posiada bardzo dobre własności statystyczne. Generator dla liczb binarnych o 6 cyfrach (dziesiętnie od 0 – 63) można opisać za pomocą wzoru:

(35)

Wszystkie możliwości generacji liczb przedstawione są na Rys. 3-6.

7 6 4 2 0 57 22 60 23 59 51 5 3 1 11 15 28 34 32 16 13 21 55 58 19 45 61 17 36 37 43 39 62 63 48 30 42 36 52 18 40 8 54 44 26 20 56 50 9 10 12 29 41 47 49 31 53 24 14 25 35 33 46 27

Rys. 3-6 Możliwe kombinacje liczb z generatora von Neumana[49]

Gdy liczbą inicjującą będzie liczba 59 otrzymamy ciąg liczb 59,51,5,3,1,0,0,0…. Z rysunku wynika że ciągi są bardzo krótkie. Kolejnym problemem, przy generatorze von Neumanna, jest zależność długości losowego ciągu od liczby inicjującej. Jak wynika z rysunku np. dla liczby 27 długość losowego ciągu wynosi 1 (cały czas ta sama liczba), natomiast dla liczby 19 maksymalny ciąg wynosi 10 (19,45,61,17,36,28,34,16,32,0,0…). Aby uniknąć powtarzających się serii liczb przy każdym uruchomieniu generatora, konieczne jest inicjalizowanie go różną liczbą przy każdym starcie. W przypadku generatora von Neumana prowadzi to do różnych długości ciągu. Jest to czynnik praktycznie dyskwalifikujący go jako generator. Istnieją rozwiązania omijające ten problem, tj pamiętające wszystkie liczby do jest pory wygenerowane, jednak zwiększa to znacząco objętość pamięciową programu. Pomimo że sam generator von Neumana jest praktycznie niewykorzystywany, to wywodzi się z niego sporo generatorów opartych na podobnej zasadzie [49].

3.4.3.3 Generatory liniowe

Generatory liniowe działają w oparciu o ogólny wzór

(36)

są liczbami całkowitymi stanowiącymi parametry generatora, c jest wyrazem wolnym. Generator oparty o wzór(35) z niezerowym c jest znany w literaturze pod nazwą ogólny generator liniowy.

3.4.3.4 Generator multiplikatywny

(37)

Generator ten jest generatorem okresowym. W przypadku generowania mniejszej ilości liczb niż wynosi jego okres oraz przy odpowiednim doborze parametrów, generator ten można traktować jako wystarczająco losowy. Okresowość tego generatora jest pożądana. Uniezależnia ona długość generowanego ciągu od liczby inicjującej, jak to miało miejsce w przypadku generatora von Neumana. Tylko niektóre wartości parametrów mogą służyć do generacji liczb pseudolosowych. Przykładowo generator o i był używany jako standardowa procedura RAND na komputerach IBM360/370 [49]. Oczywistym jest, że generator powinien pracować zawsze w części aperiodycznej generowanego ciągu.

Rozważając generator liczb binarnych (m = 2M ) można wykazać [3], że maksymalny okres generatora jaki można uzyskać wynosi 2M-2 . Warunkiem uzyskania takiego okresu jest nieparzystość liczby inicjującej x0 oraz spełnienie przez warunku: lub

. Wybór modułu

Moduł określa górne ograniczenie wartości liczb, które będą generowane. Jeżeli nie zachodzi taka potrzeba to nie należy sztucznie ograniczać tego zakresu. W urządzeniach elektronicznych mamy przeważnie do czynienia z liczbami zapisanymi w pamięci w systemie dwójkowym od 8 bitowych dla małych mikrokontrolerów po 64 bitowe dla komputerów. Przyjęto że jest największą możliwą do zapisania liczbą w danym układzie (dla 8 bitowego mikrokontrolera = 256).

Najprostszą do zaimplementowania możliwością jest przyjęcie za moduł . W takim przypadku operacja modulo wykonana zostanie, gdy zignorujemy bit przeniesienia liczby przy operacji mnożenia.

Okazuje się jednak, że obserwując zachowanie się poszczególnych bitów, można zauważyć, że najmniej znaczące bity są dużo mniej losowe niż te bardziej znaczące. Aby poprawić

właściwości statystyczne tego generatora, można jako moduł przyjąć wartość . Rozważając ograniczamy zakres generowanych liczb o jedna liczbę. W przypadku generator może zwrócić liczbę , której nie można zapisać w założonym układzie liczbowym. Jednym z możliwych rozwiązań jest jej odrzucenie i powtórna generacja. Otrzymujemy, tak jak w pierwotnym algorytmie liczby z zakresu .

Dużo lepsze wyniki, pod względem statystycznym, otrzymać można przyjmując za moduł liczbę pierwszą. Najlepszym wyborem jest największa liczba pierwsza mniejsza od liczby . Wadą takiego rozwiązania jest znaczący wzrost złożoności obliczeniowej takiego algorytmu [50].

Wybór mnożnika

Wybór mnożnika przy ustalonym module determinuje długość niepowtarzającego się ciągu liczb losowych. W przypadku generatora multiplikatywnego, nie jest możliwy taki dobór mnożnika, żeby wszystkie liczby z zakresu ograniczonego przez moduł występowały w ciągu generowanych liczb.

Maksymalny możliwy okres aperiodyczny dla generatora multiplikatywnego wystąpi gdy będą zachodzić następujące warunki:

 jest względnie pierwsze z

 jest elementem pierwotnym modulo

Elementem pierwotnym modulo nazywamy każdą wartość o największym możliwym rzędzie modulo m. Z kolei rząd modulo m jest najmniejszą liczbą całkowitą , dla której

, gdzie jest względnie pierwsze z .

Długość maksymalnego okresu przy tych założeniach wynosi:

G o ow ż og c w go c o c go ok go generowanego. Mimo tego, j o jc ę c j tosowanym w praktyce generatorem [50].

3.4.3.5 Generator mieszany

(38)

Generator mieszany jest generatorem okresowym. Można uzyskać, w przeciwieństwie do generatora multiplikatywnego, okres generacji równy m. Warunki aby generator tak pracował są następujące:

b musi być liczbą pierwszą względem m

dla każdego czynnika pierwszego p liczby m

jeżeli 4 jest dzielnikiem liczby m

Okazuje się, że generatory mieszane, mimo potencjalnie dłuższych okresów generowanych liczb, mają gorsze własności statystyczne od generatorów multiplikatywnych. Istnieje implementacja generatora, przy odpowiednim doborze współczynnika , w której nie występuje mnożenie a przesunięcie bitowe. Niestety ten generator mimo niewielkiej koniecznej mocy obliczeniowej jest pod względem statystycznym jedną z gorszych możliwości generowania liczb pseudolosowych[48].

3.4.3.6 Generatory addytywne

Najprostszym, historycznie pierwszym generatorem addytywnym jest generator Fibonacciego, opisany wzorem

(39)

Ogólnie generatory addytywne opisane są wzorem

(40)

Ciągi generowanych liczb mają rozkłady dobrze równomierne, niestety nie spełniają testów niezależności oraz serii. Istnieją modyfikacje tego algorytmu, które są pozbawione tej wady:

(41)

Niestety przy tej modyfikacji dużo lepsze pod względem złożoności obliczeniowej są generatory multiplikatywne[49][50].

W dokumencie Index of /rozprawy2/10812 (Stron 35-40)

Powiązane dokumenty