C言語
乱数

C言語で乱数を生成

More than 1 year has passed since last update.


rand関数

C言語で乱数を生成したい、そんな時は乱数を返すrand関数を使用します。

乱数を生成するためには元となる種が必要になります。

種が同じ値だと出力される値が同じになってしまい、乱数になりません。

そこで現在時刻を種として使用し、プログラムが起動したタイミングで種の値が変わるようにします。

種を設定するにはsrand関数を使用するのですが、先に現在時刻を返すtime関数を見てみましょう。


time関数

現在時刻を出力するために、time関数を用います。


time関数のプロトタイプ宣言

time関数のプロトタイプの宣言は以下のようになっています。

time_t time(time_t *time);

プロトタイプの宣言の仕方は、返り値の型 関数名(引数の型);です。

今回の場合はtime_tが返り値の型、timeが関数名、time_t *timeが引数の型を指しています。

time_t *timeでの*はポインタ変数を使いますよ、という宣言をしているだけなので、ポインタの中身を出す*とは異なります。

関数を利用するときはtime(引数)と記述し、引数にはtime_t型のポインタを渡すかNULLを指定します。

返り値は1970年1月1日0時0分0秒(UTC)からの経過秒数です。


引数 time_t型のポインタとNULLの違い

time_t m;

time(&m);

time(NULL);

どちらのやり方でも返り値は同じ値が返ってきますが、

time_t型のポインタを渡す場合には、引数のアドレスにも返り値の値が格納されます。


乱数の生成

これらを組み合わせて、以下のように書いたりします。

#include <stdio.h>

#include <stdlib.h>
#include <time.h>

int main {
srand((unsigned int) time(NULL)); //現在時刻を元に種を生成
int price = (rand()%3+1) * 100; //100、200、300の何れかを返す
}

rand関数を使用するにはstdlib.h、time関数を使用するには、time.hを読み込む必要があるので、最初にincludeします。

srand関数で生成した種を元に、rand関数は乱数(0~RAND_MAX)を返しますが、%演算子を使えば、乱数の値を制限できます。

%3することで0~2が返ってくるので、1を足して100を掛けると、100、200、300の何れかを返すようになります。


参考

C言語入門 - 関数のプロトタイプ宣言

時間情報の取得 time() - 時間の扱い - 碧色工房

C言語逆引きハンドブック