Allora, l'esercizio si dovrebbe articolare in quattro step. Quello che mi crea più problemi è il primo:
1) Definire una funzione float misuraPi(int nPunti, float a); che, presi in ingresso il numero di punti da utilizzare e il lato a del quadrato centrato nell’origine che include la circonferenza di raggio unitario, restituisca una misura di $pi$.
Infatti non saprei dove mettere le mani per scrivere questa funzione. L'idea sarebbe considerare un generatore di numeri casuali nel quadrato in modo tale che le loro coordinate siano o dentro o fuori la circonferenza unitaria. Da quello che mi ricordo poi il rapporto \(\displaystyle \text{punti nella circonferenza}/\text{punti totali} \) dovrebbe essere un'approssimazione di $pi$. Quindi pensavo di fare così: con un ciclo for, genero una coppia di numeri casuali $(x, y)$ per ogni punto in input, imponendo la condizione $-a/2<x,y<a/2$. Dopodiché calcolo la distanza dall'origine di ciascuno di questi punti e se essa risulta $<=1$ aumento un contatore per i punti che entrano nella circonferenza. Infine esco dal ciclo e calcolo il rapporto.
Questo è quello che mi è uscito:
- Codice:
float misurePi(int nPunti, float a){
float x, y;
int centri=0;
for(unsigned int j=0; j<nPunti; j++){
x=randUnif(-a/2,a/2);
y=randUnif(-a/2,a/2);
if(distO(x,y)<=1){
centri++;
}
return (float) centri/nPunti;
}
dove le funzioni randUnif e distO sono definite così:
- Codice:
float randUnif(float a, float b){
if (a==b)
return a;
if (a>b){
float tmp;
tmp=a;
a=b;
b=tmp;
}
srand(time(NULL));
return ((float)rand()*(b-a)/RAND_MAX+a); //oppure rand()%(b-a)+a
}
float distO (float x, float y){
return sqrt(x*x+y*y);
}
Cosa ne dite, fino a qui può avere senso il procedimento? Nel secondo punto, dovrei salvare un certo numero di misure in un array dinamico:
- Codice:
float *esperimentoPi(int nPunti, float a, int nMisure){
float* results=new float[nMisure];
for(unsigned int i=0; i<nMisure; i++){
results[i]=misurePi(nPunti, a);
}
return &results;
}
Ho due dubbi essenziali: è corretto usare & per la variabile di return? E quando chiamo la funzione nel main con i parametri attuali, devo mettere l'*?