AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Randomize-Chaos

Ein Thema von himitsu · begonnen am 13. Aug 2012 · letzter Beitrag vom 14. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

Randomize-Chaos

  Alt 13. Aug 2012, 01:32
Delphi-Version: XE2
Es heißt ja, daß man den (Pseudo)Zufallsgenerator nicht ständig neu initialisieren soll.......



Wieso ist noch keiner Auf die Idee gekommen den Generator gleich in der Inititalization der System.pas zu initialisieren?

Mal im Delphi-Quellcode etwas umgesehn, wird es überall gefunden.

OK, diese Stellen sind nicht optimal, aber wenigstens wird es jeweils nur einmal ausgeführt.
Allerdings gibt es immernoch ein winziges Problemchen, wenn irgendwo bei der Initialisierung schon Zufallszahlen verwendet werden.
Delphi-Quellcode:
unit System.IOUtils;
class constructor TPath.Create;

unit IdHMAC;
initialization

unit SyncController;
initialization
Das wird etwa jedes 4-milliardste Mal bei Aufruf der Funktion neu initialisiert, immernoch nicht ideal, aber besser als nichts.
Delphi-Quellcode:
unit IdMessageCoderMIME;
class function TIdMIMEBoundaryStrings.GenerateRandomChar: Char;
begin
  if RandSeed = 0 then begin
    Randomize;
  end;
Die nun folgenden Stellen sind demnach also ganz schlimm, da bei jedem Aufruf am Generator rumgespielt wird.
Delphi-Quellcode:
unit SessColn;
constructor TSessionIDGen.Create;

unit IdFTPCommon;
function MakeXAUTKey : Cardinal;

unit IdDNSCommon;
constructor TDNSHeader.Create;

unit IdCustomHTTPServer;
//function GetRandomString(NumChar: Cardinal): string; // nicht öffentlich, aber in Folgendem verwendet
function TIdHTTPDefaultSessionList.CreateUniqueSession(const RemoteIP: String): TIdHTTPSession;

unit Datasnap.Win.ObjBrkr;
function TServerCollection.GetBalancedName: string;

unit Data.DBXEncryption;
//function GenerateKey(KeyLength: Integer): string; // nicht öffentlich, aber in Folgendem verwendet
constructor TPC1Cypher.Create;




Am Schönten wäre es ja, wenn man den Generator in einen Record verpacken würde, also den Zufallswert als Feld und dazu ein paar Record-Methoden und Property für den Zugriff.
Eine Instannz dann als Singleton (globale Variable) und im Class-Constructor initialisiert. Und jeder der glaubt das ständig neu initialisieren zu müssen, kann sich gerne eine eigene Instanz zulegen.

Über ein Event und/oder eine überschreibbare Methode mit einer anderen Berechnungsroutine ausrüstbar.
$2B or not $2B
  Mit Zitat antworten Zitat
Namenloser

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

AW: Randomize-Chaos

  Alt 13. Aug 2012, 02:23
Das habe ich mir auch schon oft gewünscht... aber ich denke es ist einfach aus Gründen der Abwärtskompatiblität so. Genau wie dass bei Strings der erste Index 1 ist und vieles andere...

Manchmal denke ich mir, es wäre doch schön, die Sprache mal zu entrümpeln bzw. einen Neuanfang zu machen. Aber das wird wohl nicht passieren, denn dann würde Delphi wohl völlig obsolet, da es ja ohnehin schon einige moderne, schöne Sprachen gibt, die noch nicht so viel Ballast haben, und weiter verbreitet sind.

Btw: Wieso ein Record und keine Klasse? Muss heutzutage denn immer alles ein Record sein?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Randomize-Chaos

  Alt 13. Aug 2012, 03:46
Na ja, ich muß allerdings auch zugeben, dass ich nicht selten in einem Programm mit Zufallszahlen gearbeitet habe, wo es mir durchaus in den Kram paßte, dass es immer dir gleichen Zufallszahlen waren, da ich auf diese Weise den gleichen Ablauf hatte und so bewußt auf Fehler reagieren konnte. Wenn ich z. B. bei einem Spiel einen Fehler bei einem bestimmten Ablauf habe, dann habe ich ihn immer, auch wenn ich das Programm 50 mal starte. Ich weiß dann genau wann der Fehler kommt. Stimmt alles und es gibt keine Fehler, wird dann mit richtigen Zufallszahlen gearbeitet.

Ich glaube also nicht, dass es ein alter Bug ist.

Und die 0 bei der Index, warum nicht, warum ein Wert verschwenden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Randomize-Chaos

  Alt 13. Aug 2012, 06:23
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.

Und in der Unit System darf noch kein Speicher über den MemoryManager reserviert werden, denn sonst könnte der Programmierer später keinen eigenen MM laden, womit eine Klasse also wegfällt.

Für die Abwärtskompatibilität könnte man die "alten" Funktionen ja auf die Record-Methoden umleiten und die Randomize-Prozedur einfach leer (ohne Funktion) lassen.
$2B or not $2B

Geändert von himitsu (13. Aug 2012 um 06:31 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Randomize-Chaos

  Alt 13. Aug 2012, 07:19
Also das der PRNG ohne Zutun immer die gleichen Zahlen liefert, ist so gewollt.
Bei Strings würde ich mal sagen, das es irgendwie logisch ist, wenn ich auf S[1] zugreife, um das 1.Element einer Zeichenkette zu bekommen.

Bei Arrarys ist es etwas anders, denn dort ist die Nomenklatur aus der Mathematik i.a. so, das x_0 das erste Element einer Reihe ist.

In den 70er Jahren war das so üblich. Meine ersten Programmiererfahrungen habe ich auch mit Arrays gemacht, die bei 1 anfangen. Wobei die Programmiersprache schon die Möglichkeit bot, 0-basierte Arrays zu deklarieren. Das war eine Option, die für das gesamte Programm galt und in der ersten zeile stehen musste.

So, und wer denn per se immer andere Pseudozufallszahlen haben will, der nimmt i.a. sowieso einen richtigen PRNG und nicht dieses G'lump von Delphi.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Randomize-Chaos

  Alt 13. Aug 2012, 14:47
So, und wer denn per se immer andere Pseudozufallszahlen haben will, der nimmt i.a. sowieso einen richtigen PRNG und nicht dieses G'lump von Delphi.
Was verstehst du denn unter richtigen Zufallszahlen? Bist du nicht der Meinung, dass Delphi Zufallszahlen liefert?

Wobei, ich hatte mal zwei Probleme mit Zufallszahlen. Einmal wollte ich eine Explosion darstellen. Das Objekt zerfiel in über 1000 Teile, aber immer mit einem schönen Muster. Das ergab sich aus der gleichen Verteilung der Zufallszahlen. Die Explosion hatte eine in der Natur unnatürliche gleiche Verteilung.

Für eine andere Gelegenheit hatte ich einen eigenen Zufallsgenerator geprogt, der sehr zufällig war. Der neigte wiederum dazu so unzuverlässig alles zu verteilen, dass ich wieder die Delphifunktion nutzte.

Was sind also richtige Zufallszahlen?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Randomize-Chaos

  Alt 13. Aug 2012, 15:03
Richtige Zufallszahlen (und die meine ich nicht) entstehen durch ein stochastisches Muster aus der Natur, siehe hier.

PRN, also Pseudozufallszahlen, sind Ergebnisse einer mathematischen Gleichung bzw. Funktion und haben den Anschein, als seien sie zufällig. In Wirklichkeit wiederholen sie sich aber, was deine Muster erklären könnte (

Gute PRNG haben neben einer sehr langen Periode noch andere Eigenschaften, die sie für statistische Verfahren geeigneter erscheinen lassen, als der doch recht einfache Delphi-PRNG.

Nachzulesen bei Wiki & Co
  Mit Zitat antworten Zitat
Namenloser

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

AW: Randomize-Chaos

  Alt 13. Aug 2012, 15: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
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

AW: Randomize-Chaos

  Alt 13. Aug 2012, 15:56
@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.
Was sollen denn das für Erfahrungen sein? Random durchläuft immer die gleiche 32-Bit Sequenz, randseed wählt nur den Einstiegspunkt in die Sequenz.
  Mit Zitat antworten Zitat
Benutzerbild von Coder
Coder

Registriert seit: 27. Feb 2004
Ort: Bochum
206 Beiträge
 
Delphi 3 Professional
 
#10

AW: Randomize-Chaos

  Alt 13. Aug 2012, 16:01
So, und wer denn per se immer andere Pseudozufallszahlen haben will, der nimmt i.a. sowieso einen richtigen PRNG und nicht dieses G'lump von Delphi.
[...]
Was sind also richtige Zufallszahlen?


ich dachte, das mit den Zufalls- und Pseudzufallszahlen hätten Hagen und andere schon vor Jahren erklärt.

Zufallszahlen = nur durch etwa gemessenen radioaktiven Zerfall

Pseudozufallszahlen = durch eine Formel; immer wieder reproduzierbar; z.B: kann man auch RC4 zur Erzeugung von Pseudozufallszahlen verwenden.


Aber dies ist sicherlich auch vielen schon bekannt. Entschuldigung.
ICQ: 204141443
Delphi 3 Professional, Intel 2x 2,4Ghz, 3 GB-Graka, Sound-onBrd, --
außerdem D2S, D3Pro, D4S, D5S, D6S, D7S + Indy, Lazarus, VB5Std, VC++5Pro, Tasm4+5 - was braucht man mehr?
-
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz