Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Randomize o.O (https://www.delphipraxis.net/158670-randomize-o-o.html)

himitsu 25. Feb 2011 19:35

Delphi-Version: 2010

Randomize o.O
 
n'abend,

sacht ma, kann's sein, daß Random neuerdings automatiosch initialisiert (Randomize) wird?

Jedenfalls hab ich das komische Gefühl, als wenn sich in Delphi 2010/XE der Wert ständig ändert, wenn ich im OnCreate mir da eine Zahl geben lasse. :stupid:

Allerdings nicht in einer ganz einfachen Konsolenanwendung, also wenn, dann währe der Übeltäter wohl irgendwie die böse VCL.



War das im Delphi 7 auch schon so, oder hab ich das nur nie mitbekommen?

Whookie 25. Feb 2011 19:48

AW: Randomize o.O
 
Uiuiui ... du hast scheinbar recht. In Delphi 2010 kommt jedesmal beim Start ein neuer Wert.

In Delphi 2007 kommt immer 0!

Daniel 25. Feb 2011 19:49

AW: Randomize o.O
 
Na endlich macht die Funktion, was sie soll. ;-)

Wolfgang Mix 25. Feb 2011 19:51

AW: Randomize o.O
 
:-)

himitsu 25. Feb 2011 20:17

AW: Randomize o.O
 
:lol:
Gut, ich dachte schon ich hab'se nimmer alle.

Jetzt hab ich nur noch das Problem, daß Random vermutlich nicht wirklich threadsave ist, aber was soll's.
(ein kleiner Integer, welcher zufällig in zwei Threads mal den selben Wert ergeben könnte, weil das zur fast genau selben Zeit mehrmals aufgerufen wurde)

Bernhard Geyer 26. Feb 2011 09:54

AW: Randomize o.O
 
Zitat:

Zitat von himitsu (Beitrag 1084440)
Allerdings nicht in einer ganz einfachen Konsolenanwendung, also wenn, dann währe der Übeltäter wohl irgendwie die böse VCL.

Kompilier doch mal mit Debug-DCU's und häng einen Brechpunkt auf die Randomize-Funktion. Dann sieht du ja wer hier voreilig zuschlägt.

himitsu 26. Feb 2011 14:50

AW: Randomize o.O
 
Jetzt wo du's sagts ... hatte doch gestern eine Suche danach losgelassen und dann ganz vergessen nachzusehn wo dieses passiert :oops:

*stunden später*

hier gefunden, wo alles Randomize oder RandSeed gesetzt wird:
TSessionIDGen.Create (SessColn)
TPath.Create (IOUtils)
TServerCollection.GetBalancedName (ObjBrkr)
TIdMIMEBoundaryStrings.GenerateRandomChar (IdMessageCoderMIME)
TDNSHeader.Create (IdDNSCommon)
GetRandomString (IdCustomHTTPServer)

Ich dachte man soll Randomize möglichst nur einmal aufrufen?
Wie soll man sowas können, wenn es überall gesetzt wird? :?

Ach ja, hier die Position, wo das Randomize nun standardmäßig initialisiert wird (StackTrace):
System.Randomize
IOUtils.TPath.Create
System.InitUnits
System.StartExe
SysInit.InitExe
Project3.Project3

Somit ist ein Klassenkonstruktor in der Unit IOUtils schuldig
und diese Unit wird irgendwo über die VCL eingebunden wird,
bzw die Unit IniFiles, welche diese IOUtils einbindet, aber wer nun die blöde IniFiles einbindet, das hab ich auf die Schnelle nicht rausgefunden.

Muellermilchtrinker 26. Feb 2011 15:21

AW: Randomize o.O
 
Also bei meinem Delphi 2009 Professional muss man Randomize nicht aufrufen :D

rollstuhlfahrer 26. Feb 2011 16:57

AW: Randomize o.O
 
Toll wäre es ja gewesen, wenn in der Unit System im INITIALIZATION-Block einfach ein Randomize aufgerufen wird. Da dieser Block standardmäßig ausgeführt wird (alles bindet die Unit System ein) und auch nur genau 1 Mal, ist wenigstens der Ort richtig.

Warum Indy Randomize aufruft, liegt wohl daran, dass sich bestimmt irgendwelche Programmierer beschwert haben, GetRandomString würde keine zufällige Zeichenkette zurückgeben. (Vermutung)

Benrhard

sx2008 26. Feb 2011 18:49

AW: Randomize o.O
 
Eigentlich sollte ein Zufallszahlengenerator durch eine Klasse gekapselt werden.
Dann könnte man beliebig viele voneinander unabhängige Generatoren bereitstellen und es gäbe keine programmweiten Nebenwirkungen.
Ich denke das liegt daran, dass sich die Pogrammierer seit Turbopascal so sehr an Random() und Randomize() gewöhnt haben, dass man sich nicht getraut hat diesen alten Zopf abzuschneiden.

himitsu 26. Feb 2011 20:03

AW: Randomize o.O
 
Randomize als leere Funktion ohne Funktion,
für RandSeed eine ThreadVar, statt einem normalen Var
und beim ThreadInit jeweils das eigentliche Randomize.

Keine Änderung an alten Programmen, die neuen Programme sind automatisch threadsicher und mehrfache Aufrufe von Randomize haben keine Auswirkung.

Bummi 26. Feb 2011 22:17

AW: Randomize o.O
 
Wenn man sich die Implenetierung von Randomize ansieht verstehe ich das "Gewese" im Sinne von "Nur einmal aufrufen" ohnehin nicht.
Wenn man keine Loops in der Art
Delphi-Quellcode:
For i := x to y do
begin
   Randomize;
  x := Random(z);
  Use(x)
end
kann man IMHO Randomize so oft aufrufen wie man will.

rollstuhlfahrer 27. Feb 2011 15:58

AW: Randomize o.O
 
Bei deinem Beispiel geht das aber nicht gut. Da die Schleife viel zu schnell durchläuft, setzt Randomize immer wieder RandSeed auf den aktuellen Timer-Wert. Somit wird (dem Algo sei dank ^^) immer wieder die gleiche Zufallszahl generiert. Oder hat sich da seit D7 was geändert?

Bernhard

himitsu 27. Feb 2011 17:09

AW: Randomize o.O
 
Man hat inzwischen getTickCount gegen QueryPerformanceCounter ersetzt, so daß sowas zum Glück nur noch selten passiert.

Aber, ...

Derartige Pseudozufallsgeneratoren sind auf eine möglichst optimale "Gleichverteilung" ausgelegt
und wenn man Randomize zu häufig aufruft, dann könnte sich dieses negativ auf die Verteilung der erzeugten Zahlen auswirken.

rollstuhlfahrer 27. Feb 2011 17:15

AW: Randomize o.O
 
Kommt ganz darauf an, ob man gleichverteilte Zufälle haben will oder nicht.

Bernhard

himitsu 27. Feb 2011 17:25

AW: Randomize o.O
 
So könnte man aber keinen Einfluß auf die Verteilung nehmen.

Wenn man wirklich keine Gleichverteilung will, dann sollte man doch lieber eine Gewichtung einführen.

Teekeks 27. Feb 2011 17:32

AW: Randomize o.O
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1084682)
Bei deinem Beispiel geht das aber nicht gut. Da die Schleife viel zu schnell durchläuft, setzt Randomize immer wieder RandSeed auf den aktuellen Timer-Wert. Somit wird (dem Algo sei dank ^^) immer wieder die gleiche Zufallszahl generiert. Oder hat sich da seit D7 was geändert?

Bernhard

^^
Guck dir doch noch mal bitte genau an was er geschrieben hat:
Zitat:

Zitat von Bummi (Beitrag 1084609)
Wenn man keine Loops in der Art
Delphi-Quellcode:
For i := x to y do
begin
   Randomize;
  x := Random(z);
  Use(x)
end
kann man IMHO Randomize so oft aufrufen wie man will.



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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