-1

我有一个问题,我需要在 -3 和 3 之间生成 1000 个高斯分布数,然后将它们绘制在直方图上。到目前为止,这是我的代码:

全局声明的数组:

double s, u[1000], v[1000], z;
  int gauss[1000];
  double transformed[2000];

      void run(){
      int max;
      while(1){
      srand( time(NULL) );
      generateec();
      transform();
      max = findMax();
      plot( max );
      getchar();  
      }}

void plot ( int max )
{

   int j, s;

   for ( j=0; j<maxPlus; j++ )
   {
   printf("%3d (%5d) > ", j, gauss[j] );
   for ( s=0; s<transformed[j]*barWidth/max; s++ ) printf("|");

   printf("\n");
    }
 }
int findMax()
  {
   int j;
   int max = transformed[0];

  for ( j=1; j < maxPlus; j++ )
  {
  if ( transformed[j] > max )
  max = transformed[j];
 }

 return max;
 }
void generateec(){
srand( time(NULL) );
for(int i = 0; i < 1000; ++i)
 {
u[i] = (double)rand()/(double)(RAND_MAX);
v[i] = (double)rand()/(double)(RAND_MAX);
 }
}

void transform(){
for(int i = 0; i < 1000; ++i)
{
    if( (u[i] + v[i]) > 0){
    s = (u[i]*u[i])+(v[i]*v[i]);
    transformed[2*i] = sqrt(-2.0 * log(u[i])) * cos(2 * pi * v[i]); 
    transformed[2*i+1] = sqrt(-2.0 * log(u[i])) * sin(2 * pi * v[i]);  
    }

}

printf("%d %d %d \n", transformed[0], transformed[500], transformed[600]);

   }

我从 main 函数调用 run 函数,生成数字,转换它们,然后绘制它们。出于某种原因,当我运行它时,我得到了全零。我不知道为什么,任何帮助都会很棒,

多谢你们!

4

3 回答 3

0

我尝试使用缺少的声明来完成您的代码,并且 Box-Muller 转换似乎正在工作。

我相信您的问题出在数组的声明中,而您在发布的代码中忽略了它。

下面是修改后的程序:(用 编译gcc -std=c99 -lm boxmuller.c -o boxmuller

 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
 #include <math.h>

 double v[1000];
 double u[1000];
 double transformed[2000];


 void generateec() {
   //srand( time(NULL) );
   for(int i = 0; i < 1000; ++i)
   {
     u[i] = (double)rand()/(double)(RAND_MAX);
     v[i] = (double)rand()/(double)(RAND_MAX);
   }
 }

 void transform(){
   static const double pi = 3.14159265358979323846;
   for(int i = 0; i < 1000; ++i)
   {
     if( (u[i] + v[i]) > 0) {
       double s = (u[i]*u[i])+(v[i]*v[i]);
       transformed[2*i] = sqrt(-2.0 * log(u[i])) * cos(2 * pi * v[i]);·
       transformed[2*i+1] = sqrt(-2.0 * log(u[i])) * sin(2 * pi * v[i]);··
     }
   }
   printf("%f %f %f \n", transformed[0], transformed[500], transformed[600]);
 }

 void run(){
   int max;
   srand( time(NULL) );
   while(1){
     generateec();
     transform();
     //max = findMax();
     //plot( max );
     getchar();··
   }
 }

 int main(int argc, char** argv) {
     run();
     return 0;
 }

一些额外的点:

  • 您可能不想在每次迭代时使用计时器重新初始化随机数生成器。
  • 你打印浮点数就好像它们是整数一样。
  • 变换生成具有 N(0,1) 分布的数字,即均值 = 0、标准差 = 1 的高斯分布。
于 2013-05-10T19:59:46.203 回答
0

我仍然打赌它的数组。如果你看一下 u 和 v,它们不是全局声明的。他们在哪里宣布?他们被分配到什么地方?

于 2013-05-10T19:41:46.197 回答
0

我将假设u, v,transformed被正确初始化为(否则你会崩溃)。仔细检查,然后这是你/一个问题:

printf("%d %d %d \n", transformed[0], transformed[500], transformed[600]);

它应该是

printf("%f %f %f \n", transformed[0], transformed[500], transformed[600]);

当然,数组应该声明为doubleor float。截断很可能是这里的罪魁祸首。

于 2013-05-10T19:47:24.700 回答