09/06/2018, 14:09
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;
}
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);
}
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;
}
09/06/2018, 21:13
float randUnif(float a)
{
return rand() % (int)a + (float)rand() / RAND_MAX;
}
10/06/2018, 14:22
float misuraPi(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)<=a/2){
centri++;
}
}
return (float) 4*centri/nPunti;
}
float randUnif(float a, float b){
if (a==b)
return a;
if (a>b){
float tmp;
tmp=a;
a=b;
b=tmp;
}
return ((float)rand()*(b-a)/RAND_MAX+a);
float distO (float x, float y){
return sqrt(x*x+y*y);
}
10/06/2018, 20:06
La funzione randUnif l'ho presa da un vecchio esercizio. L'idea sarebbe di avere una funzione che mi restituisca un numero casuale compreso tra due numeri fissati, in questo caso voglio che le coordinate x e y del mio punto siano comprese tra −a/2 e a/2. Non capisco perché non dovrebbero essere casuali i numeri ottenuti...
float randUnif(const float &a)
{
return a * rand() / RAND_MAX;
}
Però testandolo il codice restituisce subito zero (un main in cui stampo soltanto la funzione) quindi c'è qualcosa che non torna
13/06/2018, 15:29
#include <iostream>
#include <fstream>
#include <ctime>
#include <cmath>
#include <cstdlib>
using namespace std;
float randUnif(float, float);
float distO (float, float);
float misuraPi(int, float);
//************************************************************************//
int main(){
srand(time(NULL));
int n;
float lato;
cout << "Inserire nPunti: ";
cin >> n;
cout << "Inserire lato: ";
cin >> lato;
cout << misuraPi(n, lato) << endl;
return 0;
}
//************************************************************************//
float randUnif(const float &a)
{
return a * rand() / RAND_MAX;
}
float distO (float x, float y){
return (x*x+y*y);
}
//************************************************************************//
float misuraPi(int nPunti, float a){
float x, y;
int centri=0;
for(unsigned int j=0; j<nPunti; j++){
x=randUnif(a/2);
y=randUnif(a/2);
if(distO(x,y)<=pow(a,2)/4){
centri++;
}
}
return (float) 4*(centri/nPunti);
}
13/06/2018, 18:34
if(distO(x,y)<=pow(a,2)/4)
if(x * x + y * y <= a * a / 4)
return (float) 4*(centri/nPunti);
return (float) 4*centri/nPunti;
13/06/2018, 20:59
return a * rand() / RAND_MAX;
return (a * rand()) / RAND_MAX;
return a * (rand() / RAND_MAX);
return (float) 4*(centri/nPunti);
13/06/2018, 22:55
1. Non c'è alcuna ragione di passare un valore in virgola mobile per riferimento se non deve essere modificato. Rendi il codice solo piú lento..
3. Piuttosto che dividere è in generale meglio moltiplicare. Per cui a≤b/c è meglio scritto come a∗c≤b..
Ci sono regole come la precedenza della moltiplicazione sulla somma che vengono dall'algebra, ma altre sono piú arbitrarie e non sono necessariamente le stesse quando si cambia linguaggio.
13/06/2018, 23:33
14/06/2018, 00:01
... e il problema è piú che altro legato alla leggibilità e al fatto che quando dopo mesi tocchi di nuovo il codice non ricordi necessariamente che l'ordine delle operazioni era importante.
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.
Powered by phpBB © phpBB Group - Privacy policy - Cookie privacy
phpBB Mobile / SEO by Artodia.