首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数传递问题

参数传递问题
EN

Stack Overflow用户
提问于 2014-04-09 21:20:50
回答 1查看 47关注 0票数 0

考虑到以下代码:

代码语言:javascript
复制
#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;
}

在stdDev函数中,我注意到向量v的每个元素等于avg (v =v1=.= avg),所以标准差是零!实际上,v的元素应该是res1或res2的元素。我不明白是怎么回事!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-09 21:29:00

您的代码可能运行得足够快,以至于time(NULL)通常总是返回相同的值。在使用给定的种子执行srand之后,每次对rand的调用都将返回相同的值。

我们通常只在程序开始时执行srand(time(NULL))一次。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22974181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档