Salve a tutti
Sono un fisico alle prime armi con c++.
Dovrei implementare un programma che mi restituisca una distribuzione di numeri che seguano una binormale ( http://automatica.ing.unibs.it/mco/m.../gauss_2d.html ) secondo il metodo di Von-Neumann :
1) Si genera un metodo per produrre una serie di numeri casuali compresi tra 0 e 1 con il seguente programma:
float RNG(int& seed)
{
const int a = 40692;
const int m = 2147483647; // periodo 2^31 --> rappresentazione 32 bit
const int q = m/a;
int k,r;
float rand;
r = m%a;
k = seed/q;
seed = a*(seed - k*q) - k*r;
if(seed<0){
seed =seed + m;
}
rand = (float)seed/(float)m;
return(rand);
}
int main()
{
int n;
int seed = 54321;
FILE *fp;
fp=fopen("random.dat","w+");
if (fp==NULL) { printf("impossibile");
system("PAUSE");exit(1);}
cout<<"Quanti numeri vuoi generare ?"<<endl;
cin>>n;
for(int i=0; i<n;i++){
float y = RNG(seed);
fprintf(fp," %f %f\n",x,y);
}
system("PAUSE");
return 0;
}
2) Dovrei confrontare questi numeri con la binormale g() avente valore massimo = g. Cioè dati due numeri random x e R, prodotti con il metodo precedente, se g(x)/g > R allora conservo l'evento viceversa lo scarto.
Il mio problema è che devo implementare la binormale senza usare funzioni in libreria, inoltre devo passargli sigma1, sigma2, e il coefficiente di corrrelazione lineare rho.
Grazie a tutti

Rispondi quotando
