forum speccy.pl

ZX Spectrum => PROGRAMOWANIE => Wątek zaczęty przez: steev w 2021.06.14, 00:08:42

Tytuł: RND
Wiadomość wysłana przez: steev w 2021.06.14, 00:08:42
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?
Tytuł: Odp: RND
Wiadomość wysłana przez: steev w 2021.06.14, 02:47:20
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 :
SEED =((SEED + 1) * 75 ) % 65537 - 1;
RND = SEED / 65536
Tytuł: Odp: RND
Wiadomość wysłana przez: damik w 2021.06.14, 08:51:20
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 ?
Tytuł: Odp: RND
Wiadomość wysłana przez: matofesi w 2021.06.14, 11:10:41
@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 ;)
Tytuł: Odp: RND
Wiadomość wysłana przez: damik w 2021.06.14, 12:56:09
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 :)
Tytuł: Odp: RND
Wiadomość wysłana przez: matofesi w 2021.06.14, 13:05:04
Ogólnie dobrze myślisz, ale... RANDOMIZE powoduje zapis parametru do SEEDa a jeśli jest wołane bez parametrów to ładuje do SEEDa zawartość zmiennej systemowej FRAMES - dlatego jeśli chcesz mieć "w pełni losową losowość" to zanim zaczniesz wołać RND robi się RANDOMIZE. A jeśli chcesz mieć "powtarzalną losowość" to wtedy robisz RANDOMIZE z parametrem i kolejne wywołania będą zwracały elementy tego samego ciągu.

I nie. R nie jest wykorzystywane w żaden sposób do "poprawienia losowości" ;) Zwłaszcza, że dwa następujące po sobie odczyty - bo SEED jest dwubajtowy -  dawałyby zasadniczo dwie "prawie kolejne" wartości z przedziału 0-127, czyli całość byłaby średnio losowa.

I nie - takie pytania absolutnie nie są głupie :)
Tytuł: Odp: RND
Wiadomość wysłana przez: steev w 2021.06.14, 13:50:14
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 ?
Tak.
Nie.
System po restarcie nie dotyka tej zmiennej systemowej, pozostaje ustawiona na 0.