AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language STABW berechnen-Qualität des Zufallszahlengenerators beurteilen
Thema durchsuchen
Ansicht
Themen-Optionen

STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

Ein Thema von mabstudent · begonnen am 6. Jan 2013 · letzter Beitrag vom 8. Jan 2013
Antwort Antwort
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#1

STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

  Alt 6. Jan 2013, 12:30
Delphi-Version: 5
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 )
Miniaturansicht angehängter Grafiken
zufallszahlen.jpg  
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

  Alt 6. Jan 2013, 15:49
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ß
Volker Zeller

Geändert von Volker Z. ( 6. Jan 2013 um 17:26 Uhr)
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#3

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

  Alt 7. Jan 2013, 16:43
Vielen Dank!
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

  Alt 8. Jan 2013, 08:18
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.
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#5

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

  Alt 8. Jan 2013, 13:55
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?
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: STABW berechnen-Qualität des Zufallszahlengenerators beurteilen

  Alt 8. Jan 2013, 14:46
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?
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:13 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