-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]);

   }

メイン関数から関数 run を呼び出し、数値を生成して変換し、プロットします。何らかの理由で、実行するとすべてゼロになります。理由はわかりませんが、どんな助けでも素晴らしいでしょう、

みんなありがとう!

4

3 に答える 3

0

私はまだ配列に賭けています。u と v を見ると、それらはグローバルに宣言されていません。どこで宣言されていますか? 彼らは何に割り当てられていますか?

于 2013-05-10T19:41:46.197 に答える
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;
 }

いくつかの追加ポイント:

  • おそらく、すべての反復でタイマーを使用して乱数ジェネレーターを再初期化したくないでしょう。
  • float を整数であるかのように出力します。
  • 変換は、N(0,1) 分布の数値を生成します。つまり、平均 = 0、標準偏差 = 1 のガウス分布です。
于 2013-05-10T19:59:46.203 に答える