2012/06/18

C言語 乱数 rand()

子供がJavaで作ったプログラムをCに移植してみたら、乱数の部分がうまくいかない。やっぱりCは原理的なことを学習しないと先に進めないと思えた。それがCのよいところ。

乱数

/** 0 以上 1 以下の範囲の乱数値(double) */
#include <stdio.h>
#include <stdlib.h>
#include <time.h> 
int main(void){
     int i;
     double ran;
     printf("RAND_MAX: %d\n",RAND_MAX);
     /* 同じ値にならないようにtimeで初期化 */
     srand((unsigned)time(NULL));
     /* まず1から100の間の乱数を求める */
     int ran1 = rand()%100+1;
     printf("rand1(1 to 100): %d\n",ran1);
     /* 求めた100回以下をループ 最後の値を使用 */
     for(i=0; i<ran1; i++){
         ran = (double)rand()/RAND_MAX; 
     }
     printf("rand(): %f\n",ran);
     return 0;
}
Cのrand()は実行環境で違いがあるようだ。RAND_MAXを実行することで、どんな値が出てくるか確認することができる。「32767」と出たので、0から32767の間でランダムに整数が出力されることになる。この値を好きなように計算して、欲しい範囲に設定すればよい。ところが実際には毎回同じ値しか出てこない。擬似乱数を勉強する必要がある・・・ とりあえず定番のtimeで初期化することで、比較的バラバラな値が出るようになった。でも移植したプログラムは頻繁に乱数を利用していたので、数秒以内に乱数を使うと、近い値が並んでしまうことが判明。そこで2重に乱数を使って、多少バラバラになるようにしてみた。Javaだと1行で出来たことがCではこんなになってしまう。そのうち乱数のことをよく調べてみよう。乱数の関数を1から自作してしまってもいいかも。
RAND_MAX: 32767
rand1(1 to 100): 45
rand(): 0.976806
参考 WIKI 後から調べたらここに書いてあった。
http://ja.wikipedia.org/wiki/Rand

C言語 ANSI C89 Meadow & MinGW GCC 目次