ZX Spectrum > PROGRAMOWANIE

RND

(1/2) > >>

steev:
Jak to właściwie jest z tym generatorem liczb pseudolosowych w specu?
Albo raczej - czego nie rozumiem?

Wg ROMu i sieci, Spectrum oblicza RND jako resztę z dzielenia (SEED + 1) * 75 / 65537
Ale obliczenia pokazują jak poniżej.
Skąd ta różnica?

steev:
Albo raczej + wszyscy w sieci mówią źle lub niezrozumiale :)
RANDOMIZE inicjuje 'seed', aka wartość początkową generatora.
RND najpierw wylicza kolejną wartość 'seed', a dopiero potem liczy z niej wartość wynikową.

Ergo :

--- Kod: ---SEED =((SEED + 1) * 75 ) % 65537 - 1;
RND = SEED / 65536
--- Koniec kodu ---

damik:
Kiedyś jako generatora liczb pseudolosowych dla programów w kodzie maszynowym używałem rejestru "R" w różnych systemach z Z80, dawało to ciekawe efekty podobnie jak szum na ekranie jeśli wpisywać w jego obszar pamięci kolejne wartości "R",  może Speccy też jakoś pośrednio korzysta z tego rejestru w swoim algorytmie ?

matofesi:
@damik Nie korzysta ;)

Procedura w ROMie generująca kolejną wartość RND siedzi pod $25f8 i działa dokładnie tak jak to opisał steev - najpierw pobiera seed, odkłada na stos kalkulatora potem wykonuje przeliczenie kolejnej wartości, wynik zapisuje do seed i resztę z dzielenia przez zostawia na stosie kalkulatora jako wynik operacji. To ostatnie robi zresztą śmiesznie - nie używa kalkulatora tylko sprawdza, czy bajt exponentu jest zerowy i jeśli nie, to zmniejsza go fizycznie w pamięci o $10 czyli de-facto dzieli liczbę na stosie kalkulatora przez 65536.

A używanie R jako wartości losowej może działać pod warunkiem, że potrzebujesz wartość między 0 a 127 i że potrzebujesz ją raz n jakiś czas i w nierównych odstępach czasowych. Jeśli pobierasz tę wartość w długiej pętli z małymi odstępami to bardzo szybko się przekonasz o małej losowości tego rozwiązania ;)

damik:
Czyli jeśli dobrze rozumiem to wartość początkowa seed'a jest za każdym razem taka sama podczas (losowania) pobierania pierwszej wartości RND po włączeniu komputera ?
Czyli wartości kolejnych liczb pseudolosowych będą zawsze takie same po każdym resecie komputera - dobrze myślę ?
Czy też może wartość początkowa pierwszego seed'a jest w jakiś inny sposób generowana by była inna za każdym restartem systemu ?

Dlatego moje pytanie czy wartość początkowa dla RND nie jest pobierana czasem z rejestru R albo ustalana w jakiś inny chytry sposób ... ?

Może zadaję głupie pytania, przepraszam, ale nie jest to dla mnie do końca jasne :)

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej