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言語逆引きハンドブック