Thema: Delphi Randomize-Chaos

Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Randomize-Chaos

  Alt 13. Aug 2012, 14:19
Btw: Wieso ein Record und keine Klasse? Muss heutzutage denn immer alles ein Record sein?
Nja, im Prinzip besteht aktuelle alles aus einem Integer (RandSeed) und aus ein paar Funktionen, wenn man das alles direkt zusammenmanscht, dann kommt eben ein Record raus.
Dann gibt es für Records noch die Operatoren, womit man eine implizite und explizite Integerzuweisung hinbekommt. RandSeed wird dann zum Record und man kann immernoch RandSeed := 123456; machen.
Verstehe, aber ich fände es nicht sehr intuitiv, wenn man einer Variable einen Wert zuweist, und wenn man ihn ausliest was völlig anderes herauskommt...

Du meinst ja sowas, oder?
Delphi-Quellcode:
Random := 123456;
writeln(Random); // nicht 123456 sondern irgendwas anderes
Eine Klasse hätte außerdem den Vorteil, dass man den RNG überschreiben könnte.

Delphi-Quellcode:
type
  TRNG = class
    function Random: integer; virtual; abstract;
  end;

  TRNGClass = class of TRNG;

  TRNGDefault = class(TRNG)
  protected
    RandSeed: integer;
  public
    function Random: integer; override;
    constructor Create;
  end;

function Random: integer;
procedure SetRNG(NewRNGClass: TRNGClass);

implementation

var
  RNGInstance: TRNG;

function Random: integer;
begin
  Result := RNGInstance.Random;
end;

procedure SetRNG(NewRNGClass: TRNGClass);
begin
  // So wird der RandSeed nicht jedes mal zurückgesetzt wenn irgendein Dödel
  // SetRNG mehrfach aufruft
  if RNGInstance.ClassType <> NewRNGClass then
  begin
    RNGInstance.Free;
    RNGInstance := NewRNGClass.Create;
  end;
end;

constructor TRNGDefault.Create;
begin
  // RandSeed initialisieren
end;

initialization
  SetRNG(TRNGDefault);
Wenn man z.B. deterministische Zufallszahlen braucht, kann man einfach eine eigene Klasse ableiten, und die dann entweder mit SetRNG() global setzen, oder – besser – eine eigene Instanz davon anlegen (da man ja bei so globalem Zeug nicht sicher sein kann, dass es nicht noch irgendwo anders verwendet wird).

@Popov: Nach meiner Erfahrung liefert Random schlechte Ergebnisse, wenn man mit einem RandSeed von 0 anfängt. Man kann natürlich irgendeinen anderen konstanten Wert zur Initialisierung nehmen, aber initialisieren sollte man auf jeden Fall.
  Mit Zitat antworten Zitat