おぼえがき

過ちては則ち改むるにうんぬんかんぬん

疑似乱数の生成について(C言語)

f:id:feci:20210810151051j:plain

C11

 

C11における疑似乱数の生成について。

#include <stdio.h>  //いつもの
#include <stdlib.h> //rand関数を使うための読み込み
#include <time.h>   //time関数を使うための読み込み

void main() {
  int iaib;                  //変数宣言
  srand*1//srand関数で乱数の初期化
  ia = rand() % 10 + 1;        //rand関数と剰余算で1から10までの乱数を生成
  ib = rand() % 25 + 1;        //rand関数と剰余算で1から25までの乱数を生成

 printf("iaは%d\nibは%d\n"iaib);
}

C言語で疑似乱数を生成するには、srand関数とrand関数という2つの関数を使います。

 

まずsrand関数で疑似乱数の値を初期化します。

そしてその初期化処理のあとに、rand関数で疑似乱数を生成していきます。

 

詳しいことはよく分かりませんが、srand関数を使って乱数を初期化する場合は、srand関数のパラメータは ((unsigned)time(NULL); とする決まりがあるそうです。

こうしないと、rand関数で疑似乱数を生成する際に、その出目の偏り方がとんでもないことになるらしいです。

 

なのでsrand関数を使う場合にはパラメータの値は0とかではなく、上記のtime関数を使った記述を用いるのが一般的な方法らしいです。

 

ちなみにstdlib.hは、rand関数を使うためにincludeしています。

またtime.hは、time関数を使うためにincludeしています。

 

 

そして実際の疑似乱数の生成はrand関数でおこないます。

しかしこのとき、i = rand(); のようにただrand関数を実行しただけでは、生成される乱数の値は膨大な範囲のものになってしまいます(5桁以上)。

 

そのためrand関数を実行する際には、剰余算をセットにして使うことが多いらしいです。

たとえば上記のプログラムのように rand() % 10 + 1; とすると、得られる値は0~9の範囲の値+1となるので、1~10の範囲の値がランダムで得られるようになります。

ちなみに、もし得られる値を1~nの範囲ではなく0~nにしたい場合は、rand() % n+1 ではなく rand() % (n+1) と記述すればOKです。

 

このようにしてrand関数に剰余算+1を組み合わせて使うことで、任意の範囲の値をランダムに得られるように調整できます。

 

 

以上です。

*1:unsigned)time(NULL