Einzelnen Beitrag anzeigen

Michael II
Online

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
734 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Besseres Random() - eure Vorschläge

  Alt 28. Nov 2019, 15:45
Irgendwelche erkennbare Muster in den Bildern deuten daraufhin, dass der Pseudo-Zufallsgenerator eher P als Z ist . Umgekehrt bedeuten Bilder ohne erkennbare Muster nicht unbedingt, dass der Generator gut ist.

Man muss die Bilder unkomprimiert betrachten. Aber auch unkomprimiert ergeben sich bei Dollys "Experiment" Muster beim Delpi Generator.

Auf HD Monitoren (oder schlechter und generell) sollte man beachten, dass die Bilder "in Originalgrösse" betrachtet werden. Werden die Bilder vom Anzeigeprogramm skaliert entstehen Muster, welche im Originalbild nicht vorhanden sind.

Für Tests mit dem Delphi Generator empfehle ich dir einen Initialwert randseed := ... zu setzen, dann werden - wenn andere experimentieren - die gleichen Zahlenfolgen erzeugt.

Wenn man den in asm geschriebenen Delphigenerator (Delphi 10.3.3) betrachtet, dann ist es nicht erstaunlich, dass die erzeugten Zahlen weit weg von "echtem Zufall" sind (hier asm Code in Delphi umgesetzt):

Delphi-Quellcode:
function ra( arange : integer ): integer;
(*
        PUSH    EAX
        IMUL    EAX,RandSeed,08088405H
        INC    EAX
        MOV    RandSeed,EAX
        POP    EDX
        MUL    EDX
        MOV    EAX,EDX
        *)

var eax, edx : cardinal;
    edxeax : Uint64;
begin
  eax := randseed * 134775813; // 3*17*131*20173
  inc( eax );
  randseed := eax;
  edxeax := arange*eax;
  edx := edxeax shr 32;
  Result := edx;
end;

Du erreichst u.U. eine bessere Verteilung, wenn du den Generator statt einmal eine grosse Zahl drei mal Zahlen in einem kleineren Intervall erzeugen lässt, zum Beispiel im Intervall [0,256[ (dabei spielt die Rechengenauigkeit des Generators eine wesentliche Rolle):

Delphi-Quellcode:
  hb := TBitMap.Create;
 try
  hb.SetSize( 1024,1024 );
  hb.PixelFormat := pf32bit;

  for x := 0 to hb.Width-1 do
    for y := 0 to hb.Height-1 do
      begin
        hb.Canvas.Pixels[x,y] := RGB(random(256),random(256),random(256)); // statt random( $1000000 );
      end;

  hb.SaveToFile( 'C:\Users\micha\Desktop\bm2.bmp' );
 finally
  hb.Free;
 end;

Wenn du die Qualität eines P Zufallgenerators testen willst, reichen diese Bilder natürlich nicht.
Michael Gasser

Geändert von Michael II (28. Nov 2019 um 15:54 Uhr)
  Mit Zitat antworten Zitat