Autor Wątek: Liczby Losowe  (Przeczytany 15119 razy)

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Liczby Losowe
« dnia: 2013.10.22, 06:58:26 »
W jaki sposób wywołać funkcję INT (RND*n), jednobajtową. Jakiś CALL do ROMu?

Jaki prefix w asm, konkretnie w Pasmo stosuje się żeby zapisać liczby binarnie?
« Ostatnia zmiana: 2014.01.27, 08:14:12 wysłana przez matofesi »
AY Music, ULA plus.

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Assembler - proste pytania
« Odpowiedź #1 dnia: 2013.10.22, 08:06:59 »
Jeżeli ta liczba jest 8bit a operacja jednorazowa to może wystarczy LD A,R.

dla liczb binarnych stosuje się znak %, np %00001111 = $0F = 15

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Assembler - proste pytania
« Odpowiedź #2 dnia: 2013.10.22, 12:16:10 »
Dobra generacja liczb losowych to wcale nie jest proste zagadnienie :)

Osobiście staram się trzymać od ROMu z daleka i używam jakichś swoich procedur, podobnie zresztą jak większość innych programistów.

Spróbuję dziś wieczorem coś podesłać.

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Assembler - proste pytania
« Odpowiedź #3 dnia: 2013.10.22, 21:23:20 »
O znalazłem, dość przydatna strona dla programisty:

http://baze.au.com/misc/z80bits.html

A tutaj funkcja losowa, można ją też samemu trochę przerobić

Rand8 ld a,Seed ; Seed is usually 0
ld b,a
add a,a
add a,a
add a,b
inc a ; another possibility is ADD A,7
ld (Rand8+1),a
ret

sect0r

  • *****
  • Wiadomości: 698
  • Miejsce pobytu:
    Oltedal/NO
  • speccyholic
Odp: Assembler - proste pytania
« Odpowiedź #4 dnia: 2013.10.22, 21:38:30 »
To ja tez cos dorzuce z wykopalisk :D
http://zxsnippets.wikia.com/wiki/Random_generators (http://zxsnippets.wikia.com/wiki/ZX_Spectrum_Snippets_(ZXSS)_Wiki)

Generates a psuedo random number between 00h and FFh; the random number is loaded into A. The seed for the random number is held at location RandSeed.
       ld hl,(RandSeed)
       ld a,r
       ld d,a
       ld e,(hl)
       add hl,de
       add a,l
       xor h
       ld (RandSeed),hl

A tutaj troche matematyki: http://sgate.emt.bme.hu/patai/publications/z80guide/index.html
« Ostatnia zmiana: 2013.10.22, 21:46:05 wysłana przez sect0r »
Szarak # DivIDE+ # MasakratorFM DeluXe by Zaxon

Pyza^Illusion

  • *****
  • Wiadomości: 586
  • Miejsce pobytu:
    Lubań, dolnośląskie
Odp: Assembler - proste pytania
« Odpowiedź #5 dnia: 2013.12.12, 21:46:43 »
A to nie jest tak, że wynik jest pseudolosowy?
W określonych okolicznościach zawsze może "losować" tą samą liczbę... Chyba coś takiego już gdzieś kiedyś przerabiałem w jakiejś grze (chyba Dallas albo SuperSpekulant). Dodaliśmy tam muzykę AY na przerwaniach i jakiś kod. Po uruchomieniu ciągle losował te same parametry, a okazało się, że winny był rejestr R, który po wykonaniu jakichś instrukcji startował z odliczaniem od nowa, a kolejne instrukcje zawsze wykonywały się tyle samo czasu, co powodowało trafienie tej samej "liczby losowej". No w przybliżeniu piszę, bo już nawet nie pamiętam dokładnie jak to było.
ZX Spectrum+ (128kB by STAVI), FDD3000, TI-OF-TTL/ZXVGS, Masterface2b, MacFace II, DivIDE plus, Just Speccy 128...

steev

  • *****
  • Wiadomości: 1366
  • Miejsce pobytu:
    inode 42
Odp: Assembler - proste pytania
« Odpowiedź #6 dnia: 2013.12.12, 22:54:07 »
A każdy generator pseudolosowy (w sensie w którym kolejne kroki są liczone ze wzoru) będzie dawał na wyjściu zawsze taki sam ciąg, jeśli go zainicjujesz tą samą wartością (co może być wykorzystywane np. do szyfrowania)
I trzeba o tym pamiętać... i unikać :)

A jak porządnie zainicjować generator, to już zupełnie inna historia... ;)
Machines should work. People should think.

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Assembler - proste pytania
« Odpowiedź #7 dnia: 2013.12.13, 10:34:47 »
Rejestru R do tej pory nie ogarniam ;) Też wiem że czasem zachowuje się losowo a czasem nie  i wstawieniem jakiejś zupełnie niezwiązanej instrukcji można tę losowość popsuć.

Jakby ktoś chciał poczytać to jakieś zaawansowane generatory tworzą ludzie na WOSie:

http://www.worldofspectrum.org/forums/showthread.php?t=39632

Dla moich potrzeb jednak zawsze wystarczały prostsze rozwiązania.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Assembler - proste pytania
« Odpowiedź #8 dnia: 2013.12.13, 11:05:40 »
Rejestr R to jest wyjątkowo prosta sprawa i wyjątkowo nie nadaje się do użycia jako generator pseudolosowy - jest on (a właściwie jego młodsze siedem bitów) zwiększane przy każdym pobraniu instrukcji (na początku cyklu M1 procesora) a następnie w trzecim i czwartym takcie tego cyklu jest wystawiany na młodszych ośmiu bitach szyny adresowej (na starszych ośmiu wystawiana jest zawartość rejestru I) wraz z sygnałem /RFSH. Ten mechanizm jest przeznaczony do ciągłego "omiatania" pamięci dynamicznych w celu podtrzymania ich zawartości i miał uprościć konstrukcję komputerów - w wypadku innych procesorów trzeba było zapewniać dodatkową elektronikę generującą sygnały odświeżania pamięci.

Użycie R jako generatora pseudolosowego może mieć sens tylko w wypadku jeśli liczby potrzebujemy rzadko - w wypadku częstego losowania zwłaszcza w krótkiej i stałej pętli ryzykujemy uzyskanie bardzo krótkiego i bardzo powtarzalnego ciągu danych.

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Assembler - proste pytania
« Odpowiedź #9 dnia: 2013.12.13, 11:21:37 »
Jasna sprawa. Chociażby tęczowe paski w czasie pilota przy ładowaniu pliku z taśmy, jak wstawimy przed OUTem LD A, R. ;)

...czasem zachowuje się losowo a czasem nie  i wstawieniem jakiejś zupełnie niezwiązanej instrukcji można tę losowość popsuć.

Zachowuje się losowo, jeśli czas pomiędzy kolejnymi odczytami zmienia się.
Czyli w naszym przykładzie - w czasie ładowania danych paski nie są już "kolejne" a zupełnie zwariowane.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Assembler - proste pytania
« Odpowiedź #10 dnia: 2013.12.21, 00:46:48 »
Potrzebowałbym krótki kod, nie korzystający z procedur ROM, wypełniający 4kB losową zawartością, potrzebne to do generacji szumu.
odpowiednik w Basic:
FOR i=adres TO adres+4000 : POKE i, INT (RND*256) : NEXT i
AY Music, ULA plus.

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Assembler - proste pytania
« Odpowiedź #11 dnia: 2013.12.21, 12:40:09 »
Chociażby

FillRandom
ld hl,START
ld bc,4096

Rand ld a,0
ld b,a
add a,a
add a,a
add a,b
inc a
ld (Rand+1),a
ld (hl),a
inc hl
dec bc
ld a,b
or c
jp nz,Rand
ret

Losowość do przetestowania, pisałem na sucho

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Assembler - proste pytania
« Odpowiedź #12 dnia: 2014.01.24, 18:24:40 »
Szukałem rozwiązania, które może tworzyć "wzór" do generacji szumu. Różne próby stworzenia takiego "patternu" od zera mają wadę - powtarzalność i odtwarzany szum przypomina raczej chrapanie. Jednak najlepszym generatorem jest tutaj ROM, lub dowolny długi kod.
Kilka testów różnych modyfikacji tej procedury i podobnych. Ostatni to kopia ROM.

« Ostatnia zmiana: 2014.01.24, 18:33:53 wysłana przez Abrimaal »
AY Music, ULA plus.

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Assembler - proste pytania
« Odpowiedź #13 dnia: 2014.01.24, 20:36:41 »
Jak tu widzę głęboki porządek w niektórych tych generacjach :)

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Assembler - proste pytania
« Odpowiedź #14 dnia: 2014.01.24, 20:44:55 »
Mi coś świta ze studiów, że do liczenia wartości pseudolosowych stosuje się wielomiany. Na wiki znalazłem coś, co pachnie generatorem "komputerowym", w skrócie PRBS:
http://pl.wikipedia.org/wiki/PRBS

No i jeszcze dość przystępnie napisany materiał o podstawach generacji liczb pseudolosowych:
http://fatcat.ftj.agh.edu.pl/~chwiej/mn/generatory.pdf