/*****************************************
* 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ź.