|
|
C言語ではrand()を用いて乱数を発生させるのが基本です。基礎知識として
#include <stdio.h> #include <stdlib.h> int main(void) { int i; srand(10); /* 乱数の種を10に設定 */ printf("0から%dまでの数列\n", RAND_MAX); for(i = 0; i < 5; i++) /* [0,RAND_MAX]の整数の乱数列の出力 */ printf("%d\n", rand()); return(0); }
|
乱数の種は整数を指定するとそれに応じた[0,RAND_MAX]の整数値の 乱数が出力されます。 「プログラムを実行する度に初期値をランダムに決めたい」 という際には、時計から初期値をとる「おまじない」を行えば良いです。 「おまじない」は「srand((unsigned)time(NULL))」と書けばよく、 time関数はtime.hを書いておいてください。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i; srand((unsigned)time(NULL)); /* 乱数の種をtime からとるおまじない !!!!!! */ printf("0から%dまでの数列\n", RAND_MAX); for(i = 0; i < 5; i++) /* [0,RAND_MAX]の整数の乱数列の出力 */ printf("%d\n", rand()); return(0); }
|
rand()が [0,RAND_MAX]の整数値の 乱数を返す性質を利用して、 rand()を1.0+RAND_MAXで割ってやれば[0,1]におさまり、 これを[0,1]の一様な乱数(小数)と考えることができます。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i; double unif_rnd; srand((unsigned)time(NULL)); /* 乱数の種をtime からとるおまじない */ printf("\n0から1までの数列\n"); for(i = 0; i < 5; i++){ unif_rnd = rand()/(1.0+RAND_MAX); /* [0,1]の小数の乱数の計算!!!! */ printf("%f\n", unif_rnd); } return(0); }
|
[0,1]の一様乱数を出力するプログラムを利用して サイコロ投げのプログラムを考えます。
{1,…, 6}がそれぞれ1/6の確率で出現するようにします。 そのためには、 サイコロの出た目を(int)(rand()*(double)6/(1.0+RAND_MAX)) + 1のようにします。 これは、[0,1]の一様乱数を6倍したものを(int)にて切り捨てると {0,…, 5}の 整数値をとる一様乱数となりますが、さらに1を足せば良いことを意味しています。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i, dice; srand((unsigned)time(NULL)); /* 乱数の種をtime からとるおまじない */ printf("\nサイコロ投げの数列\n"); for(i = 0; i < 5; i++){ dice = (int)(rand()*(double)6/(1.0+RAND_MAX)) + 1; /* サイコロの乱数!!! */ printf("%d\n", dice); } return(0); }
|