Vorherige Seite Nächste Seite Inhalt

5. Der chi2-Test

Der chi2-Test prüft, ob die erzeugten Zufallszahlen sinnvoll verteilt sind, oder nicht, indem er die Abweichung der gemessenen Verteilung von einer angenommenen Gleichverteilung ermittelt. Erzeugt ein Zufallsgenerator N positive Zahlen, die kleiner alr r (Zahlenradius) sind, so ist zu erwarten daß jeder Wert in etwa N/r mal auftaucht. Jedoch sollten die einzelnen Häufigkeiten nicht identisch sein! Mathematisch wird dieser Test bewerkstelligt, indem einfach die Summe der Quadrate der einzelnen Häufigkeiten, durch die zu erwartende Häufigkeit dividiert wird. Danach wird die Größe der Folge subtrahiert (siehe auch [2]).

Formel (abgewandelt aus [2]):

chi2=i=0
    r
fi2
Nr
-N

Die Variable r gibt dabei den Zahlenradius, d.h. die größtmögliche Zufallszahl an. fi ist die Häufigkeit eines einzelnen Zufallswertes. N ist der Umfang der Stichprobe, i eine Laufvariable.

Bsp.: Die Zahl 123 kam 321 mal vor, daraus folgt daß in fi die Anzahl 321 steht.

5.1 Implementation des chi2-Tests in C++

// Name: CHII.CPP
// Aufgabe: Implementierung Chi-Quadrat-Testes in C++.
// Ersteller: Sascha Heinisch

#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <math.h>
void main()
{
 ifstream input;
 unsigned long r,n,i,t;
 unsigned long *wert;
 float chi,tt;
 clrscr();                     // Bildschirm Löschen
 input.open("chitest.dat");    // Datei öffnen
 input>>r;input>>n;            // Radius und Anzahl lesen
 cout<<"Radius :"<<r<<" Anzahl :"<<n<<endl; 
 wert = new unsigned long [r+1] ;
 for (i=0;i<=r;i++) wert[i]=0; // Feld für Radien
 for (i=1;i<=n;i++)            // die Absolute Häufigkeit
 {                             //wird hier bestimmt
   input>>t;
   wert[t]++;
 }
 tt=0; 
 for (i=0;i<=r;i++)
   tt=tt+wert[i]*wert[i]; 

// die Summe der Quadrate
// der Häufigkeiten wird gebildet
 chi = tt*(float)r/(float)n - (float) n;

// dividiert durch die zu erwartende Häufigkeit
// und subtrahiert mit der Gesamtanzahl
 cout<<"Chiquadrat "<<chi<<endl;
 if (chi<r) chi=r-chi+r;
 if ((chi-r) < 2*sqrt(r))
   cout<<" --> Der Generator ist gut!";
 else
   cout<<" --> Der Generator ist schlecht!";
 char c=getch();
 delete [r+1] wert ;
 input.close(); //Datei schließen
}

Das C++ Programm lädt eine Datei an deren Anfang der Zahlenradius steht, dann die Gesamtanzahl der Zufallswerte. Aufgrund dieser Daten wird ein dynamisches Feld angelegt, und die Häufigkeiten der einzelnen Zahlen ermittelt. Ergibt sich für chi2 ein Wert dessen Abstand zum Radius r nicht größer ist als 2 mal die Wurzel aus r (|[r-chi2]|≤2 *r), so ist das Verfahren gut! (siehe auch [2]) Dabei muß die Anzahl n der Zufallswerte etwas größer als 10 *r sein.


Vorherige Seite Nächste Seite Inhalt