乱数
ランダムに変わる乱数を用いれば,おみくじやジャンケンなどのゲームに応用できます。
乱数の値を得るには
rand() を使えば簡単に得られます。
※ rand関数には #include<string.h> が必要です。
《 test029.c 》
#include <stdio.h>
#include <stdlib.h>
int main(void){
int a ;
for(a=0;a<5;a++)
printf("%d\n", rand());
}
結果
それぞれの WEB版 IED で 上記 プログラムを実行してみました。
WEB版 IED は 全て同じ乱数の値になり、Eclipseは値が異なるものの 何度もプログラの実行を押しても同じ値になります。この乱数は疑似乱数と呼ばれ「規則性のないランダムな値」にはなりません。この線形合同法と言う計算によってランダムな値がえられますが、この線形合同法数列は周期的にパターンを繰り返す事になります。この周期つまり乱数の発生頻度が長ければ乱数としては使えるものになります。また、この計算式の元になる値を種と言い種を替える事により毎回異なった乱数が得られます。
《 test030.c 》
#include <stdio.h>
#include <stdlib.h>
int main(void) {
srand(500);
for(a=0;a<5;a++)
printf("%d\n", rand());
}
○ 結果
srand() 関数を加える事により、乱数のパターンは変わり、種は 500 から異なる種(異なる値) にすれば乱数のパターンも変わります。しかし、やはりプログラムの実行を押しても同じ値になります。種を定数から 動的な値 にすれば、この問題は解決します。毎回変わるものつまり、時間を使えばいいのです。
○ srand((unsigned int)time(NULL));
時間的要因を加えることによりプログラム実行を押せば毎回異なった値になります。
timeには #include<time.h> が必要です。
《 test031.c 》
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main(void)
{
int a ;
srand((unsigned int)time(NULL));
for(a=0;a<5;a++)
printf("%d\n", rand());
}
○ 結果
これで乱数が使えるようになりました。
-
- 0~1.0の範囲
(double)rand()/(double)RAND_MAX
※ (double) 整数から実数へ変換
RAND_MAX 乱数の最大値
- 0~1.0の範囲
- min~maxの範囲の整数乱数
(int)(min+((max-min+1)*(double)rand()/(double)RAND_MAX));または、
rand()%(max-min+1)+min
《test032.c 》#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a,b ,max,min; max=10; min=1; srand((unsigned int)time(NULL)); for(a=0;a<10;a++) { b=(int)(min+((max-min+1)*(double)rand()/(double)RAND_MAX)); printf("%10f ", (double)rand()/(double)RAND_MAX); printf("%3d ", b); printf("%3d \n", rand()%(max-min+1)+min); } }
結果
1 (mim) から 10 (max) の範囲内で乱数の整数を発生させます。