Strona 2 z 2

Re: Uruchamianie losowego dema

: 13 mar 2024, 07:21
autor: Gordian
dekanex pisze:
12 mar 2024, 23:04
Szczyt lenistwa osiągnięty :lol:
Naciskam reset i za chwilę oglądam losowe demo. Jak się skończy lub mi się znudzi to reset i kolejne. 8)
A zapisujesz gdzieś obejrzane dema i losujesz z pozostałej puli? :D

Re: Uruchamianie losowego dema

: 13 mar 2024, 10:19
autor: dekanex
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.

Re: Uruchamianie losowego dema

: 13 mar 2024, 12:52
autor: radius75
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.

Re: Uruchamianie losowego dema

: 13 mar 2024, 14:54
autor: dekanex
Zmienna TI jest zerowana przy resecie, więc to może niewiele pomóc :(
Zobaczę wieczorem to wymieszanie losowania.

Re: Uruchamianie losowego dema

: 13 mar 2024, 22:03
autor: dekanex
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.

Re: Uruchamianie losowego dema

: 14 mar 2024, 00:03
autor: =TRIANGULAR=
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

: 14 mar 2024, 07:38
autor: Gordian
=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)
Wydaje mi się, że wystarczy:

Kod: Zaznacz cały

poke54287,128:poke54290,128:printpeek(54299)

Re: Uruchamianie losowego dema

: 15 mar 2024, 10:03
autor: dekanex
Dodałem tą inicjalizację. Jeśli dobrze zrozumiałem ten artykuł na Wiki to powinno to wyglądać tak:

Kod: Zaznacz cały

10 poke54287,128:poke54290,128:a=rnd(-peek(54299))
20 print rnd(1)
i wtedy już mam najbardziej losowy wynik rnd(1) :?:

Różnica w losowaniu już jest niezauważalna ale zostawiam w ten sposób.

Re: Uruchamianie losowego dema

: 15 mar 2024, 11:53
autor: Gordian
dekanex pisze:
15 mar 2024, 10:03
Dodałem tą inicjalizację. Jeśli dobrze zrozumiałem ten artykuł na Wiki to powinno to wyglądać tak:

Kod: Zaznacz cały

10 poke54287,128:poke54290,128:a=rnd(-peek(54299))
20 print rnd(1)
i wtedy już mam najbardziej losowy wynik rnd(1) :?:

Różnica w losowaniu już jest niezauważalna ale zostawiam w ten sposób.
Raczej tak:

Kod: Zaznacz cały

10 poke54287,128:poke54290,128:a=peek(54299)
W 'a' jest wartość od 0 do 255.
Chodzi o to, aby pobrać losową wartość z generatora szumu SID'a, a nie z BASIC'owego RND.

Re: Uruchamianie losowego dema

: 15 mar 2024, 13:57
autor: dekanex
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)
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

: 15 mar 2024, 16:45
autor: Gordian
dekanex pisze:
15 mar 2024, 13:57
256 wartości to może być mało [...]
Spróbuj tak:

Kod: Zaznacz cały

10 poke54287,128:poke54290,128:a=peek(54299)*256+peek(54299)
Dostaniesz 65536 wartości. Tyle demek chyba nie masz:)

Re: Uruchamianie losowego dema

: 15 mar 2024, 20:21
autor: dekanex
Gordian pisze:
15 mar 2024, 16:45
Dostaniesz 65536 wartości. Tyle demek chyba nie masz:)
No nie :lol: 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

: 30 mar 2024, 00:41
autor: dekanex
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 :D

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