ユーニックス総合研究所

  • home
  • archives
  • c-ransu-onajininaru

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も公開しています。
興味がある方は以下のリンクからご覧ください。

Youtubeの当チャンネル

関連記事
C言語で乱数を範囲指定して取得する関数を作る
C言語の乱数(rand)の扱い方【rand_r, srand】