user3482381
user3482381

Reputation: 83

Problems with parameters passing

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

Answers (1)

aschepler
aschepler

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

Related Questions