A zapisujesz gdzieś obejrzane dema i losujesz z pozostałej puli?
Uruchamianie losowego dema
Re: Uruchamianie losowego dema
Re: Uruchamianie losowego dema
Nie. Czysty random
Choć wydaje mi się że funkcja rnd(.) coś nie jest jakoś wybitnie losowa po resecie. Zauważam powtarzalność w okolicach połowy zakresu. Robiłem sobie rozkład tej losowości w programie basic i tam jest ok ale po resecie już to tak chyba nie wygląda.
Choć wydaje mi się że funkcja rnd(.) coś nie jest jakoś wybitnie losowa po resecie. Zauważam powtarzalność w okolicach połowy zakresu. Robiłem sobie rozkład tej losowości w programie basic i tam jest ok ale po resecie już to tak chyba nie wygląda.
Re: Uruchamianie losowego dema
Funkcja RND jest "pseudolosowa", możesz jej trochę pomóc żeby była bardziej losowa niż jest.
Jak sugeruje w przykładach https://www.c64-wiki.com/wiki/RND, zrobić "inicjalizację" przed właściwym losowaniem
a=rnd(-ti)
Albo wymieszać losowanie
a=int(rnd(int(rnd(0)*1))*x)
Losowanie bez powtórzeń byłoby dobrym uzupełnieniem. Ale z wiadomych względów nie można listy już oglądanych dem przechowywać w RAM. Każde kolejne odpalone demo najprawdopodobniej by to nadpisało. Jedynie zapis listy już obejrzanych do pliku na nośnik i co jakiś czas (tzn. przy założonej ilości wpisów) zerowanie tego pliku.
Jak sugeruje w przykładach https://www.c64-wiki.com/wiki/RND, zrobić "inicjalizację" przed właściwym losowaniem
a=rnd(-ti)
Albo wymieszać losowanie
a=int(rnd(int(rnd(0)*1))*x)
Losowanie bez powtórzeń byłoby dobrym uzupełnieniem. Ale z wiadomych względów nie można listy już oglądanych dem przechowywać w RAM. Każde kolejne odpalone demo najprawdopodobniej by to nadpisało. Jedynie zapis listy już obejrzanych do pliku na nośnik i co jakiś czas (tzn. przy założonej ilości wpisów) zerowanie tego pliku.
Re: Uruchamianie losowego dema
Zmienna TI jest zerowana przy resecie, więc to może niewiele pomóc
Zobaczę wieczorem to wymieszanie losowania.
Zobaczę wieczorem to wymieszanie losowania.
Re: Uruchamianie losowego dema
Wymieszanie losowania tylko trochę polepsza sytuacje Nadal występuje dość spora powtarzalność losowania. Jak robiłem to ręcznie to było ok. Teraz po resecie dzieje się to prawie zawsze w podobnym czasie i pewnie dlatego te wyniki są dość powtarzalne. Niemniej jest na moje oko z 5-10 razy lepiej, więc dzieki za tipa
Wie ktoś może czym możma zasilić (seed) funkcję rnd() po resecie
Co do pamietania poprzednich losowań to przyszło mi do głowy, iż EF3 ma dostępne 256 bajtów RAM pod $DF00 ale jak to wyzerowałem i odczytałem po resecie to jakieś wartości już tam są. Nie wszystkie są nadpisywane ale nie wiem które zostają a które nie. Jak ktoś zna ten mechanizm to proszę o info.
Wie ktoś może czym możma zasilić (seed) funkcję rnd() po resecie
Co do pamietania poprzednich losowań to przyszło mi do głowy, iż EF3 ma dostępne 256 bajtów RAM pod $DF00 ale jak to wyzerowałem i odczytałem po resecie to jakieś wartości już tam są. Nie wszystkie są nadpisywane ale nie wiem które zostają a które nie. Jak ktoś zna ten mechanizm to proszę o info.
- =TRIANGULAR=
- Posty: 18
- Rejestracja: 24 wrz 2022, 11:11
Re: Uruchamianie losowego dema
Ja przeważnie mnożę jeden rnd(0) przez drugi rnd(0) i przez co tam jeszcze chcę rnd(0)*rnd(0)*x, albo po prostu wsłuchuje się w szum SID-a:
Kod: Zaznacz cały
poke54286,8:poke54287,0:poke54288,0:poke54289,1:poke54290,128:printpeek(54299)
Re: Uruchamianie losowego dema
Wydaje mi się, że wystarczy:=TRIANGULAR= pisze: ↑14 mar 2024, 00:03[...] albo po prostu wsłuchuje się w szum SID-a:Kod: Zaznacz cały
poke54286,8:poke54287,0:poke54288,0:poke54289,1:poke54290,128:printpeek(54299)
Kod: Zaznacz cały
poke54287,128:poke54290,128:printpeek(54299)
Re: Uruchamianie losowego dema
Dodałem tą inicjalizację. Jeśli dobrze zrozumiałem ten artykuł na Wiki to powinno to wyglądać tak:
i wtedy już mam najbardziej losowy wynik rnd(1)
Różnica w losowaniu już jest niezauważalna ale zostawiam w ten sposób.
Kod: Zaznacz cały
10 poke54287,128:poke54290,128:a=rnd(-peek(54299))
20 print rnd(1)
Różnica w losowaniu już jest niezauważalna ale zostawiam w ten sposób.
Re: Uruchamianie losowego dema
Raczej tak:dekanex pisze: ↑15 mar 2024, 10:03Dodałem tą inicjalizację. Jeśli dobrze zrozumiałem ten artykuł na Wiki to powinno to wyglądać tak:i wtedy już mam najbardziej losowy wynik rnd(1)Kod: Zaznacz cały
10 poke54287,128:poke54290,128:a=rnd(-peek(54299)) 20 print rnd(1)
Różnica w losowaniu już jest niezauważalna ale zostawiam w ten sposób.
Kod: Zaznacz cały
10 poke54287,128:poke54290,128:a=peek(54299)
Chodzi o to, aby pobrać losową wartość z generatora szumu SID'a, a nie z BASIC'owego RND.
Re: Uruchamianie losowego dema
256 wartości to może być mało, więc używam tej wartości tylko do wstępnej inicjalizacji RND() tak jak pisali na wiki tylko tam w przykładzie jest zmienna -TI.
Ja zamieniłem TI na odczyt z SID aby uniknąć powtarzalności TI po resecie. Później już używam RND(1)
Ja zamieniłem TI na odczyt z SID aby uniknąć powtarzalności TI po resecie. Później już używam RND(1)
c64-wiki pisze:Typical usage
X = RND(-TI) : REM Initialising
PRINT INT(RND(1)*100) : REM Integer random numbers from 0 to 99
PRINT INT(RND(1)*6)+1 : REM Integer random numbers from 1 to 6 (for dice simulation)
PRINT INT(RND(1)*49)+1 : REM Integer random number from 1 to 49 (for lotto simulation, for example famous German lotto 6 out 49)
PRINT (RND(0)*101)+100 : REM Random numbers from 100 to 201
Re: Uruchamianie losowego dema
Spróbuj tak:
Kod: Zaznacz cały
10 poke54287,128:poke54290,128:a=peek(54299)*256+peek(54299)
Re: Uruchamianie losowego dema
No nie W Assembly 64 największą kategorią jaką widziałem (może są większe) było top500.
W zasadzie aktualna wersja programu korzysta z tego co tworzy na karcie SD Assembly 64 wybierając najpierw typ (np. Year-top20) potem podtyp (np. 2022) a potem konkertną pozycję (np. 05. Still Rising)
W ten sposób wybór jest szybszy i bardziej uporządkowany.
Jak nabierze to większego "profesjonalizmu" to udostępnie tutaj.
Re: Uruchamianie losowego dema
Bawiąc się różnymi kategoriami w Assembly64 zauważyłem, że nie ma tam zawsze porządku w katalogach (podkatalogi, puste katalogi, ekstra pliki itp) i dlatego przerobiłem trochę mój programik.
Teraz stara się w podanej ścieżce ("//Demos") rekursywnie wylosować i uruchomić co się mu tylko uda. Jak się mu nie uda z jakiegoś powodu to startuje na nowo. Założyłem, iż do uruchomienia nadają się nie puste obrazy d64 oraz pliki prg, więc program szuka takich dopóki nie znajdzie lub nie przekroczy dozwolonej ilości prób (zmienna "try"). Założyłem także, iż po znalezieniu takowego komendą load"*" ładuje się prawidłowy plik. Obrazy lub katalogi w których nie da się tego zrobić trzeba poprawić lub usunąć
Program zrobił się dość użyteczny i bardziej "profesjonalny" więc go udostępniam. Przeznaczony jest głównie do obsługi kart zapisanych przez Assembly64 ale inne składanki też powinien obsłużyć.
Załączam plik crt dla easyflash który jest najwygodniejszy w użyciu, oraz prg do własnych przeróbek, który chyba najlepiej zapisać sobie na drugiej partycji sd2iec aby łatwo go potem uruchamiać po resecie czymś w stylu load"2:d" bez konieczności powrotu do root.
Wykorzystałem wszystkie zawarte w tym wątku podpowiedzi i triki, więc jeszcze raz dzięki za pomoc i uwagi mile widziane
Teraz stara się w podanej ścieżce ("//Demos") rekursywnie wylosować i uruchomić co się mu tylko uda. Jak się mu nie uda z jakiegoś powodu to startuje na nowo. Założyłem, iż do uruchomienia nadają się nie puste obrazy d64 oraz pliki prg, więc program szuka takich dopóki nie znajdzie lub nie przekroczy dozwolonej ilości prób (zmienna "try"). Założyłem także, iż po znalezieniu takowego komendą load"*" ładuje się prawidłowy plik. Obrazy lub katalogi w których nie da się tego zrobić trzeba poprawić lub usunąć
Program zrobił się dość użyteczny i bardziej "profesjonalny" więc go udostępniam. Przeznaczony jest głównie do obsługi kart zapisanych przez Assembly64 ale inne składanki też powinien obsłużyć.
Załączam plik crt dla easyflash który jest najwygodniejszy w użyciu, oraz prg do własnych przeróbek, który chyba najlepiej zapisać sobie na drugiej partycji sd2iec aby łatwo go potem uruchamiać po resecie czymś w stylu load"2:d" bez konieczności powrotu do root.
Wykorzystałem wszystkie zawarte w tym wątku podpowiedzi i triki, więc jeszcze raz dzięki za pomoc i uwagi mile widziane
Kod: Zaznacz cały
10 path$="//Demos"
20 try=5
30 printchr$(30)
40 printchr$(14)
50 d=peek(186):ifd<8thend=8
60 q$=chr$(34)
70 poke54287,128:poke54290,128
80 a=rnd(-1*peek(54299))
90 open1,d,15,"cd_":close1
100 open1,d,15,"cd"+path$:close1
110 open1,d,15:input#1,en$:close1
120 ifen$<>"00"thenprint"Folder:"+path$+" not found! Please correct":list10:end
130 print"Path:":print:printpath$;
140 print"/";
150 gosub410
160 printfi$;
170 t=t+1:ifk<32thenprint:print"Empty folder! Start again":run
180 a$=""
190 forc=.to6
200 b$=chr$(peek(4096+i+22+c))
210 ifb$<>" "thena$=a$+b$
220 nextc
230 ifa$<>"dir"thenprint:print"Not dir! Start again":run
240 fi$="cd:"+fi$
250 open1,d,15,fi$:close1
260 open1,d,15,"cd:*.d64":close1
270 open1,d,15:input#1,en$:close1
280 ifen$="00"thent=0:goto340
290 open1,d,15,"cd:*.prg":close1
300 open1,d,15:input#1,en$:close1
310 ifen$="00"thent=0:goto340
320 ift>trythenprint:print"Too many try's! Start again":run
330 goto140
340 gosub410
350 ifk=0thenprint:print"Empty image! Start again":run
360 print:print:print"Start"
370 print:print:print"lO"q$"*"q$","str$(d)",1:"
380 print:print:print:print:print"rU:"
390 fora=.to7:printchr$(145);:next
400 poke198,.:poke631,13:poke632,13:poke198,6:new
410 sys57812"$",d:poke147,0:poke780,0
420 poke781,0:poke782,16:sys65493
430 fi$=""
440 k=peek(781)+peek(782)*256:k=k-4158
450 i=32+int(rnd(int(rnd(1)))*int(k/32))*32
460 fora=0to32:a$=chr$(peek(4096+a+i))
470 ifa$=q$thenb=-1*b+1:a$=""
480 ifbthenfi$=fi$+a$
490 next
500 return
- Załączniki
-
- d.zip
- (5.82 KiB) Pobrany 145 razy