子供が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 目次