この記事では、C言語で乱数を取得する方法を解説します。
乱数とは、ランダムな値のことを言います。しかし、コンピュータはランダムな値を生成できないので「擬似乱数」という計算によってランダムな値を取得する方法が使われます。
それでは、実際に乱数を取得する方法を見ていきましょう!
stdlib.h
の rand()
関数を使うことで乱数を取得できる。
#include <stdio.h>
#include <stdlib.h> // インクルード
int main(void){
int r = rand(); // 乱数の生成
printf("%d\n", r);
}
実行結果
16807
しかし、計算によって乱数を生成している擬似乱数のため、初期値が同じだと毎回同じ値が生成されてしまいます。
上記コードを何度実行しても同じ値が出力されます。
実行結果
16807
実行結果
16807
これでは乱数を使ってる意味がありませんね。
毎回異なる乱数を取得するには srand()
で初期値を設定する必要がありますが、実行するたびに変わる値を設定しないと結局意味がありません。
そこでよく使われる手法が 時刻を初期値として設定する方法 です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // インクルード
int main(void){
// 初期値に時刻を指定
srand((unsigned int)time(NULL));
int r = rand(); // 乱数の生成
printf("%d\n", r);
}
実行結果
727842172
もう一回実行してみます。
実行結果
728161505
異なる乱数を得ることができました。
time()
の戻り値は、1970年1月1日0時0分0秒(UTC)からの経過秒数。「UNIX時間」や「エポック秒」、「POSIX時間」などとよばれている。
srand()
では、0 から RAND_MAX の範囲の整数を生成します。RAND_MAX は、環境によって違うの確認してみましょう!
#include <stdio.h>
#include <stdlib.h>
int main(void){
printf("%d\n", RAND_MAX);
}
実行結果
2147483647
乱数は基本的に任意の範囲の中から値を取得したい場合がほとんどだと思います。
そんな時は以下のような関数を使うと簡単です。
int randint(int min, int max){
return min + rand() % (max - min + 1);
}
引数で指定した min ~ max までの範囲の乱数を取得できます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randint(int min, int max){
return min + rand() % (max - min + 1);
}
int main(void){
// 初期値の変更
srand((unsigned int)time(NULL));
for(int i = 0; i < 5; i++){
// -1 ~ 2 の範囲の乱数の生成
int r = randint(-1, 2);
printf("%d\n", r);
}
}
実行結果
2
0
1
-1
2
メルセンヌ・ツイスタという乱数生成アルゴリズムを使うことで線形合同法で作成される乱数よりも偏りにくい乱数を生成できる。
詳しくは以下の記事を参考にしてください。
Link1.2. メルセンヌ・ツイスタの使い方 - C言語による乱数生成
この記事では、C言語で乱数を使う方法を解説しました。
乱数を使って擬似パチンコ的なものを作って遊んでみると面白いです。
ちなみに、継続率的なものを表現するには、乱数で 0 ~ 99 の範囲の値を取得して 49 以下は大当たり、79 以下は小当たり、それ以外はハズレ というように if文 または switch文 で分岐させることで実装できます。
ガチャなんかも同じように実装できます。
気が向いたら試してみてください☺️
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ