-1

ヒストグラム用に、通常は分布する数値の生成に取り組んでいます。これが私の2つの機能です。1 つ目は生成、2 つ目はそれらを正規分布に変換します。何らかの理由で、printf のテストを実行すると、最小の負の数が返されるだけです。これについて何か知っている人はいますか?ありがとう!

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

void generateec(){
srand( time(NULL) );
for(int i = 0; i < 1000; ++i)
 {
 u[i] = rand() % 7-3;
 v[i] = rand() % 7-3;
 }

}

void transform(){
generateec();




for(int i = 0; i < 1000; ++i)
{
    s = (u[i]*u[i])+(v[i]*v[i]);
    transformed[i] = u[i]*(sqrt( (-2.0 * log(s) ) / s)); 

}

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

 }

みんなありがとう!

4

2 に答える 2

2

の:

for(int i = 0; i < 1000; ++i)
{
    u[i] = rand() % 1;
    v[i] = rand() % 1;
 }

表現:

rand() % 1

必ずお譲り致し0ます。

編集

その間にプログラムが編集されたため、問題はsqrtプログラム内の関数の引数が負の値になる可能性があることです。引数が負の場合sqrt、ドメイン エラーが発生しsqrt、実装定義の値が返されます。

于 2013-04-14T21:00:00.483 に答える
0

わかりました。Box-Muller の変換を実装しようとしているようです。しかし、あなたのコードにはいくつかの問題があります。

まず、離散分布ではなく連続一様分布が必要なので、

u[i] = (double)rand()/(double)(RAND_MAX);
v[i] = (double)rand()/(double)(RAND_MAX);

次に、変換部分が大幅にずれています。 Box Muller Transformを参照してください。

transformed[i] = sqrt(-2.0 * log(u[i])) * cos(2 * pi * v[i]) ; 

どこでpi = atan(1)*4

2 * 1000正規分布が生成された数値があることに注意してください。したがって、transformedとして定義しdouble transformed[2000];てこれを行うことができます

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

それでも が得られる可能性はゼロではないことに注意してくださいu[i] * v[i] == 0。この問題の解決はあなたに任せます。

于 2013-04-14T21:26:49.477 に答える