atarionline.pl $D20A - powtarzalność numerków - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

  1.  
    Po każdym uruchomieniu programu z rejestru RANDOM ciągną mi się te same liczby.

    Jak najprościej uniknąć tego nieprzyjemnego efektu?
    • 2: CommentAuthormono
    • CommentTime21 Feb 2013
     
    poke $d20f,0: poke $d20f,3
    • 3: CommentAuthor0xF
    • CommentTime21 Feb 2013
     
    Te POKE mają efekt przeciwny. Jeśli masz je w programie, to się ich pozbadz.

    Jeśli nie, efekt dotyczy tylko emulatora.
    a. Zmien emulator.
    b. Dodaj czekanie na klawisz. Klawisz będziesz wciskal różnie, więc będą różne liczby losowe.
  2.  
    Nie mam takich POKE. Ciągnę po prostu za pomocą LDA RANDOM.

    W chacie sprawdzę, czy na real hw sytuacja wygląda lepiej.
    • 5: CommentAuthorEagle
    • CommentTime21 Feb 2013
     
  3.  
    OK, na Atarce działa dobrze. Czyli to tylko Altirra jest taka na maksa deterministyczna :)

    A w ostatecznej gierce to nie będzie problem, bo przed samym losowaniem będzie i tak jakieś menu, czyli siłą rzeczy będę czekał na klawisz :)
    • 7:
       
      CommentAuthortdc
    • CommentTime22 Feb 2013
     
    Na real Atari takich myków jak czekanie na klawisz robić nie trzeba, to że jakiś emulator sobie z czymś nie radzi nie powinno nas martwić.

    A wynika to z tego jak realizowane są generatory liczb losowych na pececie, na Atari nigdy nie było z tym problemu, na pececie od zawsze.
    • 8: CommentAuthor0xF
    • CommentTime22 Feb 2013
     
    Niezupełnie. Gdyby umieścić grę na cartridge okazałoby się, że prawdziwe Atari również generuje za każdym razem te same liczby pseudolosowe. Element losowości wprowadza użytkownik lub transmisja danych - elementy mechaniczne w stacjach i dyskach twardych, ani nawet SIO2PC na pewno nie działają z precyzją cyklu Atari.
    • 9:
       
      CommentAuthorlarek
    • CommentTime22 Feb 2013 zmieniony
     
    To może na wszelki wypadek stosować np. takie proste rozwiązanie:

    LDA $D20A
    ORA $14

    -------
    edit:
    nie, to też raczej niewiele da... a przynajmniej nie zawsze
    • 10: CommentAuthor0xF
    • CommentTime22 Feb 2013
     
    Nie ogarniam tego prostego rozwiązania.
    • 11:
       
      CommentAuthorlarek
    • CommentTime22 Feb 2013
     
    Nie dziwię sie ;)
    Już poprawiłem.
    • 12:
       
      CommentAuthorpirx
    • CommentTime22 Feb 2013
     
    dzieki za ten wątek - wyjaśnił mi się 1 problem, który miałem w pewnej dzikiej gierce, którą zacząłem skrobać.

    Jak w ogólności rozwiązać ten problem nie angażując użytkownika? Czyli jak uzyskać niewielkie, w przybliżeniu losowe, opóźnienie bez korzystania z urządzeń zewnętrznych?
    • 13: CommentAuthormono
    • CommentTime22 Feb 2013
     
    @mgr_inz_rafal: Zrozumiałem, że dostajesz ciągle jedną liczbę :D Fox ma rację. Nie ma potrzeby resetowania POKEYa we własnym programie.
    Nie sprawdzałem, ale czy ktoś wie może jak się zachowuje LFSR po reset? Jest zerowany czy pozostają tam stany nieustalone? No i podobnie z resetem samego POKEYa (SKCTL<-0<-3)?
    • 14: CommentAuthortebe
    • CommentTime22 Feb 2013
     
    RANDOM NUMBERS

    ->link<-

    p.s.
    Knight Lore wykorzystywał krótki kod do generowania liczb losowych, optymalizacja tej części gry polegała na zastąpieniu przez LDA $D20A
    • 15: CommentAuthorBluki
    • CommentTime22 Feb 2013
     
    Można podpatrzeć jak działa RND i RANDOMIZE w Atari Microsoft BASIC-u.
    • 16:
       
      CommentAuthorpirx
    • CommentTime22 Feb 2013
     
    procki nic nie dadzą, bo też są deterministyczne. Oczywiście czekanie na input usera załatwi sprawę.
    • 17:
       
      CommentAuthortdc
    • CommentTime22 Feb 2013 zmieniony
     

    pirx:

    dzieki za ten wątek - wyjaśnił mi się 1 problem, który miałem w pewnej dzikiej gierce, którą zacząłem skrobać.

    Jeden? A ile ich jeszcze jest ? Jak dużo to masz od razu już tytuł gry np. "99 problemów" :P
    ...bo Problem Jasia już był.
    • 18: CommentAuthor0xF
    • CommentTime22 Feb 2013
     
    Moznaby zmierzyć, po jakim czasie GTIA się nagrzeje. Albo wykorzystać niestabilne opcody. ;-)

    mono: w czasie resetu POKEYa LFSRy napelniaja się jedynkami. Poszukaj mojego artykułu w Syzygy, tam jest dokładny opis.
    • 19:
       
      CommentAuthorKrótki
    • CommentTime22 Feb 2013
     
    A jak wygląda zawartość RAM pod ROM-em po włączeniu komputera? OS jej nie zeruje, jeśli zostają tam losowe wartości to problem rozwiązany.
    • 20: CommentAuthormono
    • CommentTime23 Feb 2013 zmieniony
     
    Trudno tam chyba będzie znaleźć losowe wartości. Na komputerach, z którymi miałem do czynienia zazwyczaj widać tam sekwencje n*$00 n*$FF, czasem ucieknie gdzieś jakiś bit, ale do losowości to było temu daleko.

    @0xF: Dzięki - poszukam.
    • 21: CommentAuthor0xF
    • CommentTime23 Feb 2013
     
    Tak jak napisał Mono, prawie zawsze są tam zera i FF, a wzór zależy od maszyny. Podobnie z pamięcią dodatkową.
    • 22:
       
      CommentAuthortdc
    • CommentTime23 Feb 2013 zmieniony
     
    No to skoro wartości są prawie te same to można przeanalizować ich występowanie (rozkład), a nie wartości.
    • 23: CommentAuthormono
    • CommentTime23 Feb 2013
     
    Jeśli ktoś chce poczytać: Syzygy #7 - "Generator liczb pseudolosowych".
    @0xF: Jestem pod wrażeniem śledztwa. Świetny artykuł. Dzięki jeszcze raz.
    Swoją drogą nie przypuszczałem, że okres RANDOMa zależny jest od wyboru szerokości licznika w AUDCTL - im dłuższy okres tym lepiej więc po co to? A mając pełną tablicę wartości liczyłeś może jaki jest rozkład prawdopodobieństwa? Tak tylko z ciekawości pytam.