プロが教える店舗&オフィスのセキュリティ対策術

RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。

中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、

x = 分散 * (Σ[1~12]RAND() - 6) + 平均
で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は
x = Σ[1~12]RAND() - 6
ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか?
もし間違ってたら指摘してください。

参考文献「Cによるシミュレーションプログラム 石川宏」

#include <stdio.h>
#include <stdlib.h>
#define RAND() ((double)rand() / (1.0 + RAND_MAX))

#define NUMBER 10000 /* 発生させる乱数の数 */

main(void)
{
int j;
double u, x;
srand(5);
for (j = 0; j <= 11; j++) {
u = u + RAND();
}
x = u - 6.0;
}

A 回答 (3件)

単に乱数発生部分をループで囲んだだけですが、これで良いのでは。



#include <stdio.h>
#include <stdlib.h>
#define RAND() ((double)rand() / (1.0 + RAND_MAX))

#define NUMBER 10 /* 発生させる乱数の数 */

int main(void)
{
int i;
int j;
double u, x;
srand(5);
for(i=0 ; i<NUMBER ; i++)
{
u = 0;
for (j = 0; j <= 11; j++) {
u = u + RAND();
}
x = u - 6.0;
printf("%f\n" , x);
}
return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございいます。

このu=0;がなかったから自分でもうまくいかなかったんだと思いますが、
このu=0;の意味するところを教えていただきますか?

お礼日時:2007/11/22 13:00

乱数自体の分布が正規分布になるのでしょうか ・・・


発生させた乱数がある確立になる分布なら正規分布に近いと思いますけど
乱数自体の羅列をしたって意味が無いように思いますよ

RAND() の定義は 0以上1未満の倍精度実数を発生させているだけですよね

でしたら 0から15までの整数乱数で代用しても同じことなので
--- ここから ----
int ar[16] = {0};
int da[100] = {0};
int m = 0;
for ( int n=0; n < 100; n++ ) {
  m = rand() % 16;
  da[n] = m;
  ar[m]++;
}

// 乱数の発生頻度を表示
for( n=0; n < 16; n++ ) {
  printf( "%3d : %4d\n", n, ar[n] );
}
---- ここまで ----

期待通りの度数分布でしょうか
たいていは違うと思いますよ ・・・
    • good
    • 0

u = u + RAND();


という行がありますので、
ループ毎に
u = 0;
と初期化してやらないと、
uが際限なく増えてしまうことになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!