C言語の乱数が同じになるのはシードを初期化していないからです
- 作成日: 2024-03-20
- 更新日: 2024-03-20
- カテゴリ: C言語
C言語の乱数はrand()
で得ることができます。
#include <stdlib.h>
int rand(void);
rand()
ですが、rand()
を呼び出すだけではプログラムを再起動しても同じ乱数の列が得られます。
これはrand()
の使っているシード値が変わっていないからです。
rand()
のシード値を変えるにはsrand()
を使います。
#include <stdlib.h>
void srand(unsigned int seed);
srand()
はunsigned int
型の引数にシード値を与えます。
これを行うとrand()
のシード値を変更できます。
しかしプログラム起動ごとに同じシード値を与えていても乱数列は変わりません。
こういう場合は時間を使います。
time()
という関数があります。
#include <time.h>
time_t time(time_t *tloc);
time()
は呼び出すとtime_t
型の整数を返します。
この整数は時間を表す整数で、時間が変わるごとに変わった値になります。
引数にはtime_t
型のポインタを指定でき、指定するとそのポインタにも時間を格納します。
引数はNULLにすることができます。
あとはtime()
を使ってsrand()
でシードを初期化するだけです。
以下がサンプルコードになります。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
// time()でシードを初期化
srand(time(NULL));
printf("%d\n", rand());
return 0;
}
C言語や他の言語を扱うYoutubeも公開しています。
興味がある方は以下のリンクからご覧ください。