Zufallsgenerator ohne Hyperplanes

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

sinjin

Betreff: Zufallsgenerator ohne Hyperplanes

BeitragMi, Okt 05, 2016 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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. user posted image
  • Zuletzt bearbeitet von sinjin am Do, Okt 06, 2016 0:26, insgesamt einmal bearbeitet

Thunder

BeitragMi, Okt 05, 2016 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Smile
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

sinjin

BeitragDo, Okt 06, 2016 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ich habe es in Assembler geschrieben weil es 1. schneller ist und 2. ich besondere ASM-Funktionen wie ROR oder BSWAP benutzen kann.

BladeRunner

Moderator

BeitragDo, Okt 06, 2016 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Exclamation
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

BeitragDo, Okt 06, 2016 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDo, Okt 06, 2016 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragDo, Okt 06, 2016 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 06, 2016 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 11, 2016 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 12, 2016 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group