高斯分布变换,用直方图绘图

时间:2013-05-10 19:38:57

标签: c

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

全局声明的数组:

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函数,生成数字,转换它们,然后绘制它们。出于某种原因,我在运行它时会得到全零。我不知道为什么,任何帮助都会很棒,

谢谢你们!

3 个答案:

答案 0 :(得分:0)

我还在押注它的阵列。如果你看一下u和v,它们就不会在全球范围内宣布。在哪里宣布?他们分配给了什么?

答案 1 :(得分:0)

我将假设uvtransformed已正确初始化为(否则会导致崩溃)。仔细检查一下,这是你的问题:

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

应该是

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

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

答案 2 :(得分: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。