Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Tłumaczenie: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Rozdział 11

Liczby pseudolosowe

Używanie RANDOMIZE i RND

SPIS TREŚCI

Rozdział 11: Liczby pseudolosowe

Podsumowanie

RANDOMIZE
RND


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:



    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.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

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

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.