Delphi-PRAXiS
Seite 2 von 2     12

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

Namenloser 13. Aug 2012 15:10

AW: Randomize-Chaos
 
Zitat:

Zitat von gammatester (Beitrag 1178086)
Zitat:

Zitat von NamenLozer (Beitrag 1178085)
@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.

Ist mir bewusst. Ich habe es nicht wissenschaftlich untersucht, mir ist nur aufgefallen, dass einige meiner Programme sich seltsam verhielten, wenn sie random benutzen und RandSeed nicht initialisiert war... z.B. gab es afair starke Tendenzen zu bestimmten Zahlen.

Popov 13. Aug 2012 15:26

AW: Randomize-Chaos
 
Zitat:

Zitat von NamenLozer (Beitrag 1178090)
z.B. gab es afair starke Tendenzen zu bestimmten Zahlen.

Eine Tendenz zu bestimmten Zahlen würde ich nicht behaupten. Allerdings zeigt das kleine Beispiel, dass bei 1000 Abrufen nicht unbeding jede Zahl vorkommt.

Delphi-Quellcode:
var
  x, y: Integer;
begin
  with Canvas do
    for x := 0 to ClientWidth - 1 do
      for y := 0 to ClientHeight - 1 do
        Pixels[Random(ClientWidth), Random(ClientHeight)] := clBlack;
end;
Trotzdem ist die Verteilung gleichmäßig und ohne Tendenz. Finde ich.

Coder 13. Aug 2012 19:03

AW: Randomize-Chaos
 
Liste der Anhänge anzeigen (Anzahl: 1)
Popov, ich hab Deinen Code mal in ein Programm umgesetzt.

angehängt das Programm und hier ein Video
nach dem 15.ten Durchgang sind dann in einem kleinen fast 800x600 Feld alle Pixel besetzt.

Tatsächlich sind mir aber Bereiche aufgefallen, die immer wieder bevorzugt besetzt werden.


Video, 1280x800, h264, avi (hab momentan kein avidemux, zum in anderen Container [z.B. mp4] reinpacken, sorry)
http://www.mediafire.com/?0xc6af4zaiaiccr
2,6 MB

Wäre natürlich klasse, wenn das jemand mit Scanline umsetzen könnte ? (schneller?)

Furtbichler 13. Aug 2012 19:51

AW: Randomize-Chaos
 
Zitat:

Zitat von Popov (Beitrag 1178095)
Zitat:

Zitat von NamenLozer (Beitrag 1178090)
z.B. gab es afair starke Tendenzen zu bestimmten Zahlen.

Eine Tendenz zu bestimmten Zahlen würde ich nicht behaupten. Allerdings zeigt das kleine Beispiel, dass bei 1000 Abrufen nicht unbeding jede Zahl vorkommt.

Wie zufällig wäre denn die 1000ste Zahl, wenn Du verlangst, das bei 1000 Aufrufen jede Zahl von 1-1000 vorkommt? :wall:

Delphi-Laie 13. Aug 2012 20:13

AW: Randomize-Chaos
 
Zitat:

Zitat von himitsu (Beitrag 1178008)
Es heißt ja, daß man den (Pseudo)Zufallsgenerator nicht ständig neu initialisieren soll.......

Wer behauptet denn so etwas? Man kann ihn ständig bzw. nach jedem ersten random neu initialisieren. Dann hätte man wohl eine echte Zufallszahlenfolge.

Zitat:

Zitat von himitsu (Beitrag 1178008)
Wieso ist noch keiner Auf die Idee gekommen den Generator gleich in der Inititalization der System.pas zu initialisieren?

Auf die Idee mag schon so mancher gekommen sein. Doch dagegen spricht, daß man dann keine reproduzierbaren (Pseudo-)Zufallszahlenfolgen mehr generieren könnte.

Namenloser 13. Aug 2012 20:16

AW: Randomize-Chaos
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1178118)
Zitat:

Zitat von himitsu (Beitrag 1178008)
Es heißt ja, daß man den (Pseudo)Zufallsgenerator nicht ständig neu initialisieren soll.......

Wer behauptet denn so etwas? Man kann ihn ständig bzw. nach jedem ersten random neu initialisieren. Dann hätte man wohl eine echte Zufallszahlenfolge.

Ähm was? Nein. Weißt du was randomize macht?
Zitat:

Zitat von Delphi-Laie (Beitrag 1178118)
Zitat:

Zitat von himitsu (Beitrag 1178008)
Wieso ist noch keiner Auf die Idee gekommen den Generator gleich in der Inititalization der System.pas zu initialisieren?

Auf die Idee mag schon so mancher gekommen sein. Doch dagegen spricht, daß man dann keine reproduzierbaren (Pseudo-)Zufallszahlenfolgen mehr generieren könnte.

Wie kommst du darauf? Du kannst RandSeed doch immer noch manuell auf einen festen Wert setzen...

Popov 13. Aug 2012 21:12

AW: Randomize-Chaos
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1178118)
Wer behauptet denn so etwas? Man kann ihn ständig bzw. nach jedem ersten random neu initialisieren. Dann hätte man wohl eine echte Zufallszahlenfolge.

Jajn. Eine kleine Erweiterung des oberen Beispiels:
Delphi-Quellcode:
var
  x, y: Integer;
begin
  with Canvas do
    for x := 0 to ClientWidth - 1 do
      for y := 0 to ClientHeight - 1 do
      begin
        Randomize;
        Pixels[Random(ClientWidth), Random(ClientHeight)] := clBlack;
      end;
end;
Die Verteilung ist immer noch fast gleichmäßig. Nur sind hier doch tatsächlich Rechtecke zu erkennen :roll:

Delphi-Laie 13. Aug 2012 21:54

AW: Randomize-Chaos
 
Mit diesem beeindruckenden Ergebnis läßt sich schlecht diskutieren.

Soweit ich weiß, ist die Quelle des Randomizes die Systemzeit. Anscheinend ist die abgerufene Auflösung nicht allzu hoch. Die Struktur ist viel zu regelmäßig, was vermutlich darauf zurückzuführen ist, daß die Schleifendauer mit der eingestellten Auflösung als ziemlich regelmäßig bzw. konstant erkannt wird.

himitsu 14. Aug 2012 02:45

AW: Randomize-Chaos
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1178118)
Wer behauptet denn so etwas? Man kann ihn ständig bzw. nach jedem ersten random neu initialisieren. Dann hätte man wohl eine echte Zufallszahlenfolge.

Der Zufallsgenerator ist so auslegengt, daß er eine möglichst gleichmäßige Verteilung aufweist.

Wenn man da ständig den Generator neu startet, kann dieses Verhalten negativ beeinflußt werden, da die Gleichverteilung über einen größeren Bereich sichergestellt wird.
Nutzt man aber immer wieder nur "kleinere" Auschnitte, dann kann es passieren, daß Diese doch eine Tendenz erzeugen.

PS: Delphi nutzt einen Zufallsgenerator, mit einer Sequenz von theoretisch bis zu 4 Milliarden Werten ... da kann ein Ausschnitt von nur 1000 Werten, in sich auch noch eine größere Tendenz aufweisen.

Und das war besonsers zu merken, als Randomize noch nur GetTickCount verwendete (inzwischen, wenn mögich, QueryPerformanceCounter).
Hat man da sehr schnell hinterienander Randomize ausgeführt und einen/mehrere Werte abgerufen, dann fiehl auf, daß sich sehr oft Wiederholungen einschlichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Seite 2 von 2     12

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf