Rozdział 11


LICZBY PSEUDOLOSOWE

 

Podsumowanie

 

W tym rozdziale omawiana jest funkcja RND oraz polecenie RANDOMIZE. Oboje są wykorzystywani w związku z liczbami losowymi, zatem musisz uważać, aby ich nie mylić. Znajdują się na tym samym klawiszu (T); RANDOMIZE musiało być skrócone do RAND.

W pewnym sensie RND przypomina funkcję: wykonuje obliczenia i tworzy pewien wynik. Niezwykłe jest to, iż nie potrzebuje argumentu.

Przy każdym użyciu wynikiem jest nowa liczba losowa w zakresie od 0 do 1. (Czasami może ona być równa 0, lecz nigdy nie jest równa 1.)

Wypróbuj

 

10 PRINT RND
20 GO TO 10

 

aby zobaczyć, jak różnią się kolejne wyniki. Czy możesz w nich rozpoznać jakąś prawidłowość? Nie powinieneś; 'losowy' oznacza, że taka prawidłowość nie istnieje.

W rzeczywistości RND nie jest naprawdę losowe, ponieważ przyjmuje wartości ze stałego ciągu 65536 liczb. Jednakże są one tak ze sobą pomieszane, że przynajmniej nie tworzą żadnego oczywistego układu, a o funkcji RND mówimy, że jest pseudolosowa.

RND daje liczby losowe w zakresie od 0 do 1, jednak łatwo możesz otrzymać liczby losowe w innych zakresach. Na przykład 5*RND daje wynik pomiędzy 0 a 5, a 1.3+0.7*RND jest pomiędzy 1.3 a 2. Aby otrzymywać liczby całkowite, użyj INT (pamiętając, że INT zawsze zaokrągla w dół) jak w 1+INT (RND*6), które zastosujemy w programie symulującego kostkę do gry. RND*6 jest w zakresie od 0 do 6, lecz ponieważ nigdy nie osiąga wartości 6, INT (RND*6) daje wynik 0, 1, 2, 3, 4 lub 5.

Oto ten program:

 

10 REM program rzutow kostkami do gry
20 CLS
30 FOR n=1 TO 2
40 PRINT 1+INT (RND*6);" ",
50 NEXT n
60 INPUT a$: GO TO 20

 

Naciskaj ENTER za każdym razem, gdy chcesz rzucić kostkami.

 

Polecenie RANDOMIZE jest wykorzystywane do zmuszania RND, aby rozpoczynało od określonego miejsca w swoim ciągu liczb, co możesz zobaczyć za pomocą tego programu:

 

10 RANDOMIZE 1
20 FOR n=1 TO 5: PRINT RND,: NEXT n
30 PRINT: GO TO 10

 

Po każdym wykonaniu RANDOMIZE 1 ciąg liczb RND rozpoczyna się od 0.0022735596. W poleceniu RANDOMIZE możesz użyć innych liczb od 1 do 65535, aby RND rozpoczynało w innym miejscu.

Jeśli miałeś jakiś program z RND i miał on także kilka błędów, których nie znalazłeś, wtedy pomocnym może się okazać użycie polecenia takiego jak RANDOMIZE, aby program zachowywał się tak samo przy każdym uruchomieniu.

Samo RANDOMIZE (i RANDOMIZE 0, które daje ten sam efekt) jest inne, ponieważ rzeczywiście dokonuje uprzypadkowienia RND — zaobserwujesz ten efekt w kolejnym programie.

 

10 RANDOMIZE
20 PRINT RND : GO TO 10

 

Otrzymany przez ciebie ciąg liczb nie jest zbytnio losowy, ponieważ RANDOMIZE wykorzystuje czas od momentu uruchomienia komputera. Ponieważ niewiele się on zmienia pomiędzy wykonaniami RANDOMIZE, następne RND robi mniej więcej to samo. Lepszą losowość otrzymasz przez zamianę GO TO 10 poleceniem GO TO 20.

Oto program rzucający monety i zliczający liczbę orłów i reszek.

 

10 LET orly=0: LET reszki=0
20 LET moneta=INT (RND*2)
30 IF moneta=0 THEN orly=orly+1
40 IF moneta=1 THEN reszki=reszki+1
50 PRINT orly;",";reszki,
60 IF reszki<>0 THEN PRINT orly/reszki;
70 PRINT: GO TO 20

 

Stosunek orłów do reszek powinien wynosić w przybliżeniu 1, jeśli wystarczająco długo będziesz rzucał monetą, ponieważ na dłuższą metę oczekuje się równą liczbę orłów i reszek.

 

Ćwiczenia

1. Przetestuj regułę:

Załóżmy, że wybierzesz liczbę pomiędzy 1 a 872 i wpiszesz

 

RANDOMIZE twoja liczba

 

Wtedy następną wartością RND będzie

 

(75*(twoja liczba+1)-1)/65536

 

2. (Tylko dla matematyków.)

Niech p będzie jakąś dużą liczbą pierwszą i niech a będzie pierwiastkiem pierwotnym modulo p.

Wtedy jeśli bi jest resztą z ai modulo p (1 ≤bip-1), to ciąg

 

bi-1

p-1

 

jest ciągiem cyklicznym p-1 różnych liczb w zakresie od 0 do 1 (wyłączając 1). Wybierając odpowiednio a można sprawić, że będzie on wyglądał względnie losowo.

65537 jest liczbą pierwszą Fermata — 216+1. Ponieważ grupa multiplikatywna niezerowych reszt modulo 65537 posiada rząd wielkości będący potęgą liczby 2, to reszta jest pierwiastkiem pierwotnym wtedy i tylko wtedy, gdy nie jest ona resztą kwadratową. Wykorzystaj prawo Gausa wzajemności reszt kwadratowych, aby pokazać, że 75 jest pierwiastkiem pierwotnym modulo 65537.

ZX Spectrum wykorzystuje p=65537 i a=75 oraz przechowuje wartości bi-1 w pamięci. RND dokonuje wymiany bi-1 w pamięci przez bi+1-1 i oblicza wynik (bi+1-1)/(p-1). RANDOMIZE n (gdzie 1≤n≤65535) sprawia, że bi staje się równe n+1.

RND posiada w przybliżeniu równy rozkład w przedziale od 0 do 1.

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe