Zufallsgenerator ohne Hyperplanes
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
sinjinBetreff: Zufallsgenerator ohne Hyperplanes |
Mi, Okt 05, 2016 16:47 Antworten mit Zitat |
|
---|---|---|
Da ich gewissermaßen einen Seed dazu benutze Gruppen mit neuen Seeds zu generieren, finde ich den eingebauten Zufallsgenerator sehr schlecht dafür.
Code: [AUSKLAPPEN] 'test.bmx
superstrict import "rnd.s" extern function rnd_set(r:trnd,seed%) function rnd_upd%(r:trnd,v%) function rnd_updf#(r:trnd,v#) endextern type trnd field seed% field n1%,n2%,n3% method new() rnd_set self,millisecs() endmethod endtype global r:trnd=new trnd global seed%=$fffff0ff graphics 640,400,0,0 repeat cls drawtext "BB random",10,10 drawtext "Seed: "+seed,10,30 seed:+1 for local a%=0 until 3000 seedrnd seed+a plot rnd(640),rnd(400) next flip until keyhit(key_escape) seed=$fffff0ff repeat cls drawtext "My random",10,10 drawtext "Seed: "+seed,10,30 seed:+1 for local a%=0 until 3000 rnd_set r,seed+a plot rnd_upd(r,640),rnd_upd(r,400) next flip until keyhit(key_escape) local cnt% local t%=millisecs() repeat cnt:+1 rnd(640) local t2%=millisecs() if (t2-t>=1000) then t=t2 cls drawtext "BB random: "+pointed(cnt)+" cycles per sec",10,10 flip cnt=0 endif until keyhit(key_escape) repeat cnt:+1 rnd_updf(r,640) local t2%=millisecs() if (t2-t>=1000) then t=t2 cls drawtext "My random: "+pointed(cnt)+" cycles per sec",10,10 flip cnt=0 endif until keyhit(key_escape) end function pointed$(src$) local p%=src.length repeat p:-3 if (p>0) then src=src[..p]+"."+src[p..] else return src forever endfunction Sorry, keine Kommentare im Code, ich verquirle den Seed einfach sehr stark. Code: [AUSKLAPPEN] ;rnd.s
format MS COFF section "code" code prepare: inc dword [edi+8] ;seed mov edx,[edi+8] ;seed xor edx,$13579bdf mov ecx,edx bswap edx xor edx,ecx add edx,[edi+12] ;n1 mov [edi+12],edx ;n1 add cl,ch ror edx,cl mov eax,edx add edx,[edi+16] ;n2 mov [edi+16],edx ;n2 mov cl,dl add cl,dh bswap edx ror edx,cl xor edx,eax add edx,[edi+20] ;n3 mov [edi+20],edx ;n3 retn ;in esp+4 - trnd ; esp+8 - seed public _rnd_set _rnd_set: mov edx,[esp+8] push edi mov edi,[esp+8] mov [edi+8],edx ;seed mov [edi+12],edx ;n1 mov [edi+16],edx ;n2 mov [edi+20],edx ;n3 call near prepare pop edi ret ;in esp+4 - trnd ; esp+8 - nr public _rnd_upd _rnd_upd: push edi mov edi,[esp+8] call near prepare pop edi xor eax,eax cmp dword [esp+8],0 jz .out xchg eax,edx div dword [esp+8] mov eax,edx .out: ret ;in esp+4 - trnd ; esp+8 - nr public _rnd_updf _rnd_updf: push edi mov edi,[esp+8] call near prepare pop edi push $7fffffff and edx,[esp] push edx fild dword [esp] fild dword [esp+4] fdivp add esp,8 fld dword [esp+8] fmulp ret Hyperplanes wie im folgenden Bild sollten kaum noch auftauchen. |
||
- Zuletzt bearbeitet von sinjin am Do, Okt 06, 2016 0:26, insgesamt einmal bearbeitet
Thunder |
Mi, Okt 05, 2016 23:21 Antworten mit Zitat |
|
---|---|---|
Kannst du vielleicht erklären, was es mit diesen "Hyperplanes" auf sich hat?
Geht es darum, dass nicht der gesamte Bildraum der Zufallsfunktion ausgenutzt wird? Und wie hast du diese Bilder gemacht? Würde gerne eine eigene Implementierung eines PRNG testen. Und warum ist eigentlich der Zufallsgenerator in Assembler geschrieben? |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
sinjin |
Do, Okt 06, 2016 0:19 Antworten mit Zitat |
|
---|---|---|
Die GIF Datei habe ich aus Wikipedia: https://en.wikipedia.org/wiki/..._generator.
Also ich habe das so verstanden, das die Hyperplanes gerne im 3D-Raum auftauchen und halt mit PRNGs zusammenhängen. Habe ich öfters solche Artefakte, ich hoffe selber das die mehr oder weniger ein Ende haben. Ganz ehrlich? Hab mir den Artikel nicht durchgelesen, hab nur das Bild gesehen Ich habe es in Assembler geschrieben weil es 1. schneller ist und 2. ich besondere ASM-Funktionen wie ROR oder BSWAP benutzen kann. |
||
BladeRunnerModerator |
Do, Okt 06, 2016 10:11 Antworten mit Zitat |
|
---|---|---|
Du postest also einen Code von dem Du nicht weisst ob er sein Zielf erfüllt?
Ohne die Grundlagen davor zumindest gelesen zu haben? Super |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
sinjin |
Do, Okt 06, 2016 12:39 Antworten mit Zitat |
|
---|---|---|
Ja genau, du kannst ja gerne alle 4 Milliarden Möglichkeiten durchgehen und schauen ob nicht doch beim Seed 1.345.643.367 Hyperplanes auftauchen. | ||
BladeRunnerModerator |
Do, Okt 06, 2016 12:57 Antworten mit Zitat |
|
---|---|---|
Mein Lieber - Du schreibst einen Code der deine Seeds "durcheinanderwirbelt", weil Du auf einer Wikipediaseite gesehen hast dass ein beliebter PRNG Hyperplanes erzeugt. Was glaubst Du wie das Bild auf Wikipedia zustande gekommen ist? Da hat auch nicht irgendwer alle Kombinationen durchgetestet.
Zudem ist das durcheinanderwirbeln von Seeds - wenn es nicht immer wieder anders geschieht- nichts anderes als eine Transformation der selben und wird an deinem Problem, so es denn in inrgendeiner Form eines war, nichts ändern. Der Ansatz wäre es einen PRNG zu implementieren der eine ausreichend lange Schlüssellänge besitzt dass Regelmäßigkeiten im Muster so weit auseinanderliegen dass sie im Normalfall nicht auftreten bzw. Beachtung finden. Kein PRNG wird dir da perfekte Ergebnisse liefern, denn eine Maschine kann halt nur Pseudo(!)-Zufallszahlen erzeugen. Wenn Du nun aber überzeugt bist dass dein Generator es besser macht, teste ihn, indem Du ebenfalls eine Grafische Auswertung der Zufallszahlen vornimmst. Wenn sich weiter regelmäßige Muster zeigen, war's wohl nicht so dolle. Ansonsten wird in dem Artikel - hättest Du ihn denn doch durchgelesen- eine Reihe anderer PRNGs vorgestellt die wohl auch eine bessere Verteilung der Zahlen bieten. Einfach nur die Seeds verwursteln wird nicht zielführend sein, ein anderer Algo muss ran. Als letztes sei noch die Frage erlaubt ob deine Anwendung überhaupt eine 'zufälligere' Verteilung von Nöten hat - wenn nicht gerade Audio-/Bildmaterial damit erzeugt wird ist reichen die Standardalgorhitmen idR völlig aus um vom Anwender als ausreichen zufällig wahrgenommen zu werden. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
BladeRunnerModerator |
Do, Okt 06, 2016 13:30 Antworten mit Zitat |
|
---|---|---|
Nachtrag:
Wenn Du absolut zufälligen Zufall willst: https://www.blitzforum.de/foru...hp?t=34928 (benötigt eine Internetverbindung, basiert auf Atmosphärenrauschen, besser geht es nicht). Ein anerkannt guter Generator: http://brucey.net/programming/blitz/#bahrandom (Modul von Brucey, nutzt einen modifizierten Mersenne Twister) |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
sinjin |
Do, Okt 06, 2016 19:56 Antworten mit Zitat |
|
---|---|---|
Ich habe mir einen ähnlichen Artikel auf ner ganz anderen Seite durchgelesen und da war halt das Bild. Und genauso tritt es auch bei mir mit anderen Zufallsgeneratoren auf, wenn ich Punkte im 3D-Raum setze. Mit meiner Version nicht mehr.
Ich will ja gerade einen Pseudogenerator haben, ich brauche wie gesagt den Seed. Und zwar so wie in meinem Beispiel, das pro Punkt ein neuer Seed vergeben wird. Und wie du gesehen hast macht BlitzMax PRNG nicht den Job den ich brauche. Ich werde den von Brucey mal testen... |
||
Tennisball |
Di, Okt 11, 2016 14:51 Antworten mit Zitat |
|
---|---|---|
Darf man fragen, wofür du den Zufall überhaupt verwenden willst? Ich hoffe doch stark, dass du nicht gerade versuchst, irgendwelche kryptografischen Verfahren zu implementieren... | ||
sinjin |
Mi, Okt 12, 2016 18:57 Antworten mit Zitat |
|
---|---|---|
Ich brauche das für mein Weltraumprogramm das ungefähr so funktioniert: Man hat 1024 Sektoren in jede Richtung, jeder Sektor kann 400 Galaxien enthalten, jede Galaxie hat 400 Sterne und jeder Stern hat 60 Planten/Monde. Jetzt sage ich einfach Sektor 0 0 1 hat den Seed 1, Sektor 0 1 0 den Seed 1024, eine Galaxie hat den Seed Sektor+Galaxienummer usw... Vorher habe ich es so gemacht, dass ich für Galaxie Nummer 10, auch Galaxie 1, 2, 3..10 generieren musste, das gab aber mit der integrierten Zufallsfunktion zuviele Artefakte. | ||
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group