C言語による乱数発生の基礎

乱数発生の関数rand()

C言語ではrand()を用いて乱数を発生させるのが基本です。基礎知識として

が必要です。 rand()は与えられた乱数の種であるシードを決めると 0からRAND_MAXの整数値を返してくれます。 なお、RAND_MAXはstdlib.hで定義されていて rand()やRAND_MAXを使用する際には必ず宣言しておかなければなりません。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  int i;
  srand(10);   /* 乱数の種を10に設定 */
  printf("0から%dまでの数列\n", RAND_MAX);
  for(i = 0; i < 5; i++)   /* [0,RAND_MAX]の整数の乱数列の出力 */
    printf("%d\n", rand());
  return(0);
}

乱数の種を時計から自動的にとる

乱数の種は整数を指定するとそれに応じた[0,RAND_MAX]の整数値の 乱数が出力されます。 「プログラムを実行する度に初期値をランダムに決めたい」 という際には、時計から初期値をとる「おまじない」を行えば良いです。 「おまじない」は「srand((unsigned)time(NULL))」と書けばよく、 time関数はtime.hを書いておいてください。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
  int i;
  srand((unsigned)time(NULL));   /* 乱数の種をtime からとるおまじない !!!!!! */
  printf("0から%dまでの数列\n", RAND_MAX);
  for(i = 0; i < 5; i++)   /* [0,RAND_MAX]の整数の乱数列の出力 */
    printf("%d\n", rand());
  return(0);
}

[0,1]の一様乱数の出力

rand()が [0,RAND_MAX]の整数値の 乱数を返す性質を利用して、 rand()を1.0+RAND_MAXで割ってやれば[0,1]におさまり、 これを[0,1]の一様な乱数(小数)と考えることができます。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
  int i;   double unif_rnd;
  srand((unsigned)time(NULL));  /* 乱数の種をtime からとるおまじない */
  printf("\n0から1までの数列\n");  
  for(i = 0; i < 5; i++){
    unif_rnd = rand()/(1.0+RAND_MAX); /* [0,1]の小数の乱数の計算!!!! */
    printf("%f\n", unif_rnd); 
  }
  return(0);
}

{1,…, 6} のサイコロ投げの乱数

[0,1]の一様乱数を出力するプログラムを利用して サイコロ投げのプログラムを考えます。

{1,…, 6}がそれぞれ1/6の確率で出現するようにします。 そのためには、 サイコロの出た目を(int)(rand()*(double)6/(1.0+RAND_MAX)) + 1のようにします。 これは、[0,1]の一様乱数を6倍したものを(int)にて切り捨てると {0,…, 5}の 整数値をとる一様乱数となりますが、さらに1を足せば良いことを意味しています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
  int i, dice;
  srand((unsigned)time(NULL));   /* 乱数の種をtime からとるおまじない */
  printf("\nサイコロ投げの数列\n");   
  for(i = 0; i < 5; i++){
    dice = (int)(rand()*(double)6/(1.0+RAND_MAX)) + 1; /* サイコロの乱数!!! */
    printf("%d\n", dice);
  }
  return(0);
}

ちょっとしたプログラム例