Reputation: 83
Given the following code:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define NPOINTS 200
#define NMEASURES 50
#define PI 3.1415f
double mcIntSingleExp1(int);
double mcIntSingleExp1(int n){
int i, countIn = 0;
double x,y, integral1, integral2;
srand(time(NULL));
for(i = 0; i < n; i++){
x = ((double)rand()/(double)RAND_MAX)*PI;
y = (double)rand()/(double)RAND_MAX;
if(y <= sin(x))
countIn++;
}
integral1 = (PI * (double)countIn)/(double)n;
countIn = 0;
for(i = 0; i < n; i++){
x = ((double)rand()/(double)RAND_MAX) + PI;
y = ((double)rand()/(double)RAND_MAX) -1;
if(y >= sin(x))
countIn++;
}
integral2 = (PI * (double)countIn)/(double)n;
return integral1 - integral2;
}
double mcIntSingleExp2(int);
double mcIntSingleExp2(int n){
int i;
double x, sum = 0;
srand(time(NULL));
for(i = 0; i < n; i++){
x = ((double)rand()/(double)RAND_MAX) + 2*PI;
sum += sin(x);
}
return (1/(double)n) * sum;
}
void mcIntMultExp1(int, double [], int);
void mcIntMultExp1(int k, double res1[], int n){
int i;
for(i = 0; i < k; i++)
res1[i] = mcIntSingleExp1(n);
}
void mcIntMultExp2(int, double [], int);
void mcIntMultExp2(int k, double res2[], int n){
int i;
for(i = 0; i < k; i++)
res2[i] = mcIntSingleExp2(n);
}
double mean(double [], int);
double mean(double v[], int size){
int i;
double sum = 0;
for(i = 0; i < size; i++)
sum += v[i];
return sum/(double)size;
}
double stdDev(double [], int);
double stdDev(double v[], int size){
int i;
double avg, std_dev = 0;
avg = mean(v,NMEASURES);
for(i = 0; i < size; i++)
std_dev += (v[i]-avg)*(v[i]-avg);
return sqrt(std_dev/(double)size);
}
int main(){
double measure, deviation, res1[NMEASURES], res2[NMEASURES];
mcIntMultExp1(NMEASURES, res1, NPOINTS/2);
mcIntMultExp2(NMEASURES, res2, NPOINTS);
measure = mean(res1, NMEASURES);
deviation = stdDev(res1, NMEASURES);
printf("\nIntegral 1 = %.14lf\nStandard Deviation 1 = %.14lf\n",measure,deviation);
measure = mean(res2, NMEASURES);
deviation = stdDev(res2, NMEASURES);
printf("\nIntegral 2 = %.14lf\nStandard Deviation 2 = %.14lf\n",measure,deviation);
return 0;
}
In the stdDev function I noticed that each element of the vector v is equal to avg (v [0] = v [1] = ... = avg), so the standard deviation is zero! In fact, the elements of v should be those of res1 or res2. I do not understand what is wrong!
Upvotes: 0
Views: 51
Reputation: 72356
Your code probably runs quickly enough that time(NULL)
will usually always return the same value. After doing an srand
with a given seed, the following calls to rand
will return the same values each time.
We usually only execute srand(time(NULL))
once at the beginning of a program.
Upvotes: 5