Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   STABW berechnen-Qualität des Zufallszahlengenerators beurteilen (https://www.delphipraxis.net/172477-stabw-berechnen-qualitaet-des-zufallszahlengenerators-beurteilen.html)

mabstudent 6. Jan 2013 11:30

Delphi-Version: 5

STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich verzweifle an einer Teilaufgabe und wäre für ein paar Tipps sehr dankbar.
Die Gesamtaufgabe besteht darin den Zufallszahlengenerator der in Delphi/Lazarus über random(bereich) aufgerufen werden kann auf seine Qualität zu untersuchen und grafisch zu visualisieren. Am Ende soll die Standardabweichung berechnet werden und dabei hakt es. Zum besseren Verständnis poste ich mal den kompletten Quelltext und ein Bild des laufenden Progs im Anhang.
x Achse = Schleifenindex
y Achse = Zufallszahl

Code:
procedure TForm1.Button1Click(Sender: TObject);
var i,bereich,r,summe:integer;
    y:longint;
    zaehler: array[0..600]of longint;
    mittelwert:double;

begin
  randomize;
  image1.Canvas.brush.color:=clwhite;
  image1.canvas.fillrect(rect(0,0,600,200));
  bereich:=strtoint(edit1.text); //Zufallszahlenbereich

  IF checkbox1.checked=true THEN //von unten nach oben auftragen
  begin

  FOR i:=0 to image1.width-1 DO
    begin
    zaehler[i]:=0;        //alle Zähler i..imagebreite nullen
    end;

  FOR i:=0 TO image1.width-1 DO
    begin
    r:=random(bereich);
    inc(zaehler[r]);     //inkrementiert den Zählerplatz i um die Zufalsszahl r
    IF checkbox3.checked=true THEN image1.canvas.pen.color:=clred;
    IF checkbox4.checked=true THEN image1.canvas.pen.color:=clgreen;
    IF checkbox5.checked=true THEN image1.canvas.pen.color:=clblue;
    image1.canvas.moveto(i,200);  //nach unten links fahren
    image1.canvas.lineto(i,200-r); //Linie ziehen zur Zufallszahl
    end;
  end;
  end;
label3.caption:=floattostr(mittelwert);
Frage: Wie kann ich die STABW, also [STABW=sqrt(summe(jede Zufallszahl-mittelwert aller)/Anzahl von Zufallszahlen-1))] berechnen? -d.h.wie den Mittelwert, wie die Summe aller Zufallszahlen,...
Sollte ich das in die vorhandene Schleife integrieren?
Vorab schonmal vielen Dank und entschuldigt den Quellcode(denke nach 1Semester Maschinenbauinformatik noch nicht wirklich informatisch :wink: )

Volker Z. 6. Jan 2013 14:49

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
 
Hallo,

Zitat:

Sollte ich das in die vorhandene Schleife integrieren?
Nein. Den Mittelwert der Zufallszahlen kannst Du erst ermitteln, wenn Du alle Zufallszahlen hast.
[EDIT]Sorry, da hatte ich wohl einen Knoten in meinen Gedankengängen. Einen Teil der Mittelwertberechnung könnte bereits in der for-Schleife erfolgen. Siehe Nachtrag[/EDIT]

Mit Deinem Konstrukt berechnest Du den Mittelwert (ich gehe mal davon aus es ist das arithmetische Mittel gemeint) folgendermaßen:

Code:
AnzahlZufallsZahlen = 0
Mittelwert = 0;
Für alle zaehler[i]:
  ist zaehler[i] <> 0 dann
    AnzahlZufallsZahlen + 1
    Mittelwert = Mittelwert + i
am Ende noch

Code:
Mittelwert = Mittelwert / AnzahlZufallsZahlen
Die Summe errechnet sich wie folgt:

Code:
summe = 0
Für alle zaehler[i]:
  ist zaehler[i] <> 0 dann
    summe = summe + i - Mittelwert


Nachtrag:

Code #1 geändert
Code:
AnzahlZufallsZahlen = 0
Mittelwert = 0;

//und innerhalb Deiner for-Schleife
  ist zaehler[r] = 0 dann
    AnzahlZufallsZahlen + 1
    Mittelwert = Mittelwert + r
Gruß

mabstudent 7. Jan 2013 15:43

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
 
Vielen Dank!

Furtbichler 8. Jan 2013 07:18

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
 
Ich verstehe den Code nicht. Wenn ich Zufallszahlen erstelle und den Mittelwert nehme, dann muss ich ja wohl ALLE Zahlen addieren. Ein *IF* ist hier also garantiert fehl am Platze.

Delphi-Quellcode:
Summe := 0;
Anzahl := 0;
FOR i:=0 TO image1.width-1 DO
begin
  r:=random(bereich);
  summe := summe + r;
// Anzahl ist ja gleich image1.width, muss man also eigentlich nicht addieren.
// Aber so ist es verständlich: Pro Probe (Zufallszahl) wird die Anzahl erhöht.
  Anzahl := Anzahl + 1;
  ..
end;

If Anzahl>0 then
  Mittelwert := summe/Anzahl
else
  Mittelwert := 0;
Die Standardabweichung berechnest Du dann separat. Du hast ja die Zähler (wie häufig jede Zahl gewürfelt wurde).
Delphi-Quellcode:
summe := 0;
For i:=0 to bereich-1 do
// i ist also eine Zufallszahl und zaehler[i] sagt, wie oft sie aufgetreten ist.
  summe := summe + sqr(zaehler[i]*(i-mittelwert));

standardabweichung := sqrt(summe/(Anzahl-1));
Achtung! Die Formel ist etwas anders als deine. Laut Wiki stimmt das aber.

mabstudent 8. Jan 2013 12:55

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
 
Also, folgendes habe ich umgesetzt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,bereich,r,summe:integer; //i=Laufindex,Zufallszahlenbereich,r=Zufallszahl
    zaehler: array[0..600]of longint; //aufsummieren der Zufallszahlen an der Stelle 0..600
    anzzz:integer; //Anzahl der Zufallszahlen
    mittelwert, varianz, stabw:double;

begin
  randomize;
  image1.Canvas.brush.color:=clwhite;
  image1.canvas.fillrect(rect(0,0,600,200));
  bereich:=strtoint(edit1.text); //Zufallszahlenbereich
  anzzz:=0;
  mittelwert:=0;

  IF checkbox1.checked=true THEN //von unten nach oben auftragen
  begin

  FOR i:=0 to image1.width-1 DO
    begin
    zaehler[i]:=0;        //alle Zähler i..imagebreite nullen
    end;

  FOR i:=0 TO image1.width-1 DO
    begin
    r:=random(bereich);
    inc(zaehler[r]);     //inkrementiert den Zählerplatz i um die Zufalsszahl r
    IF checkbox3.checked=true THEN image1.canvas.pen.color:=clred;
    IF checkbox4.checked=true THEN image1.canvas.pen.color:=clgreen;
    IF checkbox5.checked=true THEN image1.canvas.pen.color:=clblue;
    image1.canvas.moveto(i,200);  //nach unten links fahren
    image1.canvas.lineto(i,200-r); //Linie ziehen zur Zufallszahl
    anzzz:=anzzz+1;
    mittelwert:=mittelwert+r;

    end;

  mittelwert:=(mittelwert/anzzz);
  varianz:=(zaehler[r]-mittelwert);
  varianz:=(varianz*varianz)/(anzzz-1);
  stabw:=sqrt(varianz);
  label3.caption:='Mittelwert= '+floattostr(mittelwert);
  label4.caption:='Anzahl Zufallszahlen= '+inttostr(anzzz);
  label5.caption:='Varianz= '+floattostr(varianz);
  label6.caption:='STABW= '+floattostr(stabw);
Ergebnis für stabw könnte meiner Einschätzung nach passen oder sieht hier jemand noch einen Denkfehler?

Gollum 8. Jan 2013 13:46

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
 
Zitat:

Zitat von mabstudent (Beitrag 1198219)
IF checkbox1.checked=true THEN //von unten nach oben auftragen
begin

...

FOR i:=0 TO image1.width-1 DO
begin
r:=random(bereich);
inc(zaehler[r]); //inkrementiert den Zählerplatz i um die Zufalsszahl r
IF checkbox3.checked=true THEN image1.canvas.pen.color:=clred;
IF checkbox4.checked=true THEN image1.canvas.pen.color:=clgreen;
IF checkbox5.checked=true THEN image1.canvas.pen.color:=clblue;
image1.canvas.moveto(i,200); //nach unten links fahren
image1.canvas.lineto(i,200-r); //Linie ziehen zur Zufallszahl
anzzz:=anzzz+1;
mittelwert:=mittelwert+r;

end;

Delphi-Quellcode:
  1: statt if CheckBox1.Checked=True then // es genügt if CheckBox1.Checked then
  2: statt Inc(zaehler[r]) // müsste es nicht zaehler[i]:=Random(bereich) heissen?
  3: if CheckBox3.Checked=True, ... // siehe 1
  4: mittelwert:=mittelwert+zaehler[i] // somit ist r überflüssig
Warum müssen die Farben nach jedem Schleifendurchlauf gesetzt werden? Reicht dies nicht einmal vor Beginn der Schleife?


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