はじめに
C言語では、rand関数を使用することで擬似乱数を生成することができる。
擬似乱数はコンピュータで擬似的に生成する乱数で、完全に偏りがないランダムな値にはならない。
コンピュータ上で完全にランダムな値を生成するのはとても困難なので、通常は代わりに擬似乱数を使用する。
rand関数を使用してみる
rand関数を使用するには、stdlib.hをインクルードする。
以下のコードを実行してみる。
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, r;
for(i=0; i<10; i++) {
r = rand(); // 乱数を生成する
printf("%d\n", r);
}
return 0;
}
出力は以下の様になる(値はそれぞれの環境で変わる)。
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
rand関数は、0 ~ RAND_MAX の間の擬似乱数を返す。
RNAD_MAX は、stdlib.h 内で定義されている。
もう一度プログラムを実行してみる。
すると、出力は先ほどと同じになる。
擬似乱数は何か元の値から生成され、先ほどは元の値が同一であったため出力が同じになる。
また、元の値をシード(種)と言う。
srand関数を使用してみる
C言語でシードを指定するには、srand関数を使用する。
srand関数は、何度も使用する必要はなく、通常はプログラムで一度だけ使用すれば良い。
srand(シード);
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, r;
srand(1); // 1 をシードに指定
for(i=0; i<10; i++) {
r = rand();
printf("%d\n", r);
}
return 0;
}
シードに 1 を指定した場合の出力。
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
また、シードを 2 に変えてみる。
srand(2);
出力
33614
564950498
1097816499
1969887316
140734213
940422544
202055088
768218109
770072199
1866991771
出力が変わった。
これをコードを変えずに実行する度に乱数の値を変えるには、実行するタイミングによって変わるもの(時間)をシードに指定すれば良い。
time関数で時間をシードに設定する
時間を取得するには、time関数を使用する。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i, r;
unsigned int t;
t = time(NULL);
srand(t);
for(i=0; i<10; i++) {
r = rand();
printf("%d\n", r);
}
return 0;
}
こうすることで、実行ごとに違う値が出力される。
ただし時間は一秒ごとに変わるので、一秒以内に複数実行しても時間が変わらずシードが同じになり、出力される値は変わらない。
1~10の範囲で結果を出力する。
time関数は、0 ~ RAND_MAX の範囲を出力する。
例えば 1 ~ 10 の値を出力したい場合は、10で割った余りに1を足せば求めることができる。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i, r;
unsigned int t;
t = time(NULL);
srand(t);
for(i=0; i<10; i++) {
r = rand() % 10 + 1;
printf("%d\n", r);
}
return 0;
}
出力例
10
2
3
7
10
4
1
9
7
6
0件のコメント