/// <summary> /// Errechnet den Korrelationswert für das Zufallsgenerierte Array /// </summary> /// <param name="k">Abstand der verglichenen Zufallszahlen</param> /// <returns>Korrelationswert des Zufallszahlengenerators</returns> public double Berechne(int k, int anz) { double[] zahlen = new double[anz]; for (int i = 0; i < anz; i++) { zahlen[i] = Bibliothek.GeneriereZufallszahl(); } if (k == 0)//wenn kein spezifisches k gewählt wurde, wird ein zufälliger Abstand zweier Zahlen ausgerechnet { int punkt1 = (int)(Bibliothek.GeneriereGleichverteilteZufallszahl01() * anz); int punkt2 = (int)(Bibliothek.GeneriereGleichverteilteZufallszahl01() * anz); k = Math.Abs(punkt1 - punkt2); } double mittelwert = Bibliothek.Verteilung.Mittelwert; // Berechnet Mittelwert aus allen Zufallszahlen double zaehler = 0; double nenner = 0; int j = 0; while (j < zahlen.Length - k) // Führt die Serielle Autokorrelation durch { zaehler += (zahlen[j] - mittelwert) * (zahlen[j + k] - mittelwert); nenner += Math.Pow(zahlen[j] - mittelwert, 2); j++; } return((double)zaehler / nenner); }
/// <summary> /// Polarmethode wie im Arbeitsbogen beschrieben /// </summary> /// <param name="x">Zufallszahl</param> /// <param name="b">Bibliothek um Zufallszahlen zu generieren</param> /// <returns>Returnt eine von den beiden generierten unabhängigen Standardnormalverteilten Zufallszahlen (x*p; y*p) Skaliert mit p</returns> public double Transformiere(double x) { x = x * 2 - 1; // In [-1,1] Verteilung ändern double rand = 0; double q = 0; do { rand = Generator.GeneriereGleichverteilteZufallszahl01(); rand = rand * 2 - 1; q = Math.Pow(x, 2) + Math.Pow(rand, 2); } while (q == 0 || q >= 1); return(Transformiere(x, rand)); }