9
8

More than 5 years have passed since last update.

C言語で乱数を生成

Posted at

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

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8