![]() |
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:
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,...
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); 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: ) |
AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
Hallo,
Zitat:
[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:
am Ende noch
AnzahlZufallsZahlen = 0
Mittelwert = 0; Für alle zaehler[i]: ist zaehler[i] <> 0 dann AnzahlZufallsZahlen + 1 Mittelwert = Mittelwert + i
Code:
Die Summe errechnet sich wie folgt:
Mittelwert = Mittelwert / AnzahlZufallsZahlen
Code:
summe = 0
Für alle zaehler[i]: ist zaehler[i] <> 0 dann summe = summe + i - Mittelwert Nachtrag: Code #1 geändert
Code:
Gruß
AnzahlZufallsZahlen = 0
Mittelwert = 0; //und innerhalb Deiner for-Schleife ist zaehler[r] = 0 dann AnzahlZufallsZahlen + 1 Mittelwert = Mittelwert + r |
AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
Vielen Dank!
|
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:
Die Standardabweichung berechnest Du dann separat. Du hast ja die Zähler (wie häufig jede Zahl gewürfelt wurde).
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;
Delphi-Quellcode:
Achtung! Die Formel ist etwas anders als deine. Laut Wiki stimmt das aber.
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)); |
AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
Also, folgendes habe ich umgesetzt:
Delphi-Quellcode:
Ergebnis für stabw könnte meiner Einschätzung nach passen oder sieht hier jemand noch einen Denkfehler?
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); |
AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
Zitat:
Delphi-Quellcode:
Warum müssen die Farben nach jedem Schleifendurchlauf gesetzt werden? Reicht dies nicht einmal vor Beginn der Schleife?
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz