Autor Wątek: RND  (Przeczytany 7290 razy)

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
RND
« dnia: 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?
Machines should work. People should think.

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: RND
« Odpowiedź #1 dnia: 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
Machines should work. People should think.

damik

  • Fresh rosin sniffer ;)
  • *****
  • Wiadomości: 2426
  • Miejsce pobytu:
    Generalnie Polska, głównie Bytom czasem Bielsko-Biała oraz okolice
  • ZX'owy i nie tylko...
Odp: RND
« Odpowiedź #2 dnia: 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 ?
Wszystkiego po trochu: Schwarz, mydło i powidło... konsole, stare i nieco nowsze komputery oraz akcesoria i duperele.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: RND
« Odpowiedź #3 dnia: 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 ;)

damik

  • Fresh rosin sniffer ;)
  • *****
  • Wiadomości: 2426
  • Miejsce pobytu:
    Generalnie Polska, głównie Bytom czasem Bielsko-Biała oraz okolice
  • ZX'owy i nie tylko...
Odp: RND
« Odpowiedź #4 dnia: 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 :)
« Ostatnia zmiana: 2021.06.14, 13:07:30 wysłana przez damik »
Wszystkiego po trochu: Schwarz, mydło i powidło... konsole, stare i nieco nowsze komputery oraz akcesoria i duperele.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: RND
« Odpowiedź #5 dnia: 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 :)

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: RND
« Odpowiedź #6 dnia: 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.
Machines should work. People should think.