kongruencyjny liczb pseudolosowych LCG - błąd obliczeń, błędna tablica dwuwymiarowa.

0
/*****************************************
* Addytywny Liniowy generator kongruencyjny liczb pseudolosowych - LCG,
* ktory generuje liczby pseudolosowe z zakresu od 0 do m - 1
**/

#include <iostream>

using namespace std;

int m = 12; // m - modul
int a = 13; // a - mnoznik
int c = 7; //c - przyrost
double x[2000]; //tablica dla x
double y[2000]; //tablica dla y[i] - n-tej liczby pseudolosowej
int n = 2000; // liczba wyl. liczb
int l;
int k = 10; //szerokosc klasy
int n1 [10]; //liczba klas
int n2 [10][10]; // liczba klas
int l2;

int main()
{
    y[0] = 3; // ziarno - liczba poprzedzajaca

    /** //ze wzoru: y[i]=(a * y[i-1] + c) mod m
    y[i-1] - poprzednia liczba pseudolosowa **/

    for (int i=1;i<2000;i++){
        y[i] = (int)((double)a * y[i-1] + (double)c) % m;
    }

    /** Jesli chcemy przedzial <0,1), to powinno byc y[i] / m ,
    Jesli zas chcemy przedzial <0,1> , to powinno byc y[i] / m-1 **/

    for(int i=0;i<2000;i++){
        x[i] = y[i] / (double)m; // ze wzoru: x|i| = y|i|/m
    }

    /** srednia **/
    double suma1=0.0;
        for(int i=0;i<2000;i++){
            suma1 = suma1 + x[i];
        }
    double x1 = suma1 / 2000; // ze wzoru: <x> = suma x|i| / N - liczba wylosowanych liczb  ~ 1/2

    double suma2=0.0;
        for(int i=0;i<2000;i++){
            suma2 = suma2 + x[i]*x[i];
        }
    double x2 = suma2 / 2000; // ze wzoru: <x^2> = suma x^2 |i| / n ~ 1/3

    double suma3=0.0;
        for(int i=0;i<2000;i++){
            suma3 = suma3 + x[i]*x[i]*x[i];
        }
    double x3 = suma3 / 2000; // ze wzoru: <x^3> = suma x^3 |i| / n ~ 1/4

    cout << "<x>: " << x1 << endl << "<x^2>: " << x2 << endl << "<x^3>: " << x3 << "\n" << endl; // pokaz srednia <x>, <x^2> i <x^3>

    for (int i=0;i<2000;i++){
        l = (int)(x[i]/0.1); // ze wzoru = = int (x[i] / szerokosc klasy)
        n1[l]++;
    }

    for(int i=0;i<10;i++){
        cout << "n1[" << i << "] = " << n1[i] << endl; // wypisanie ilosci liczb w kadej z klas
    }

    double X1 = 0.0;
    double nt = (double)n/(double)k; //ze wzoru nt = N/k

    for (int i=0;i<10;i++){
        X1 = X1 + ((double)n1[i] - nt)*((double)n1[i] - nt) / nt;
    }
    cout.precision(10);
    cout << "\nX1 = " << fixed << X1 << "\n" << endl; //wyswietl X1

    /** liczenie podwójnej tablicy n2 - do poprawienia **/

    for (int i=0;i<2000;i++){
            for(int j=0;j<2000;j++){
                l2 = (int)(x[i]/0.1);
                n2[l][l2]++;
            }
    }

    for(int i=0;i<10;i++){
        for( int j=0;j<10;j++){
            cout << "n2[" << i + j << "] = " << n2[i][j] << endl; // w tym momencie pokazuje bledny wynik
        }
    }

  return 0;
}

Jeśli ktoś ogarnia umysłem matematycznym dylemat z zakresu statystki, to proszę o podpowiedź, jak zrobić prawidłowo liczenie na podwójnej tablicy, abym miał prawidłowo obliczany wynik. Ewentualnie proszę o priv z linkami do innych źródeł w Internecie, gdzie mogę uzysjac odpowiedź.

0

Nie wiem jak inni ale ja na przykład nie wiem gdzie jest problem. Co to niby znaczy

w tym momencie pokazuje bledny wynik

? Napisz konkretnie jak to uruchamiasz, jakie podajesz parametry, czego oczekujesz i co się dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1