9 付録(乱数)

乱数とは,バラバラな数列のことを言う.とくに,自然数がめちゃくちゃに現れるよう なものを自然乱数という.0以上無限大までの全ての自然数を用いた自然乱数が考えられ るが,実際上は最大の自然数を決め,その範囲で考えることが多い.我々が使用している システムのC言語の場合,0〜2147483647の範囲5の 乱数を発生させることができる.

C言語では,rand()関数を使って乱数を発生させる.例えば,次のようにすると, rand()関数が呼び出される度にその関数が乱数を返し,配列a[i]に格納される.

  for(i=0; i<ndata; i++){
    a[i]=rand();
  }

コンピューターは,正確にプログラムのとおりに計算を行う.そのため,めちゃくちゃな 順序で数が並んでいる乱数を発生させることは苦手である.先ほどのrand()関数は, ある初期値6を使って,計算により乱数を決 めている.同じ初期値をつかうと,同一の数列が発生するこのになる.これで は,乱数とは言い難いので,初期値を毎回変更するのが普通である.そのため,実行毎に 異なる初期値を決める必要がある.現在の暦時刻を返すtime()関数を用いるのが一 般的である.初期値の設定は,srand()関数に引数(符号無し整数) を渡すことによ り可能である.次のようにすれば,毎回異なる初期値を決めることができる.

srand((unsigned int)time(NULL));

ただし,1秒以内であればtimeは同じ値となり,同一の数列となる.(unsigned int)は,キャストと呼ばれる強制型変換で,引き続く値の型を変換している. time()関数の引数は暦時刻で,暦時刻がポインターで格納される.暦時刻を格納す る必要がないときには,NULLと空ポインターを指定する.

乱数を発生させるためには,rand()srand()time()関数が必要である. これらの関数を使うためには,関数の宣言が書かれているヘッダーファイルをインクルー ドしなくてはならない. rand()srand()にはstdlib.htime()にはtime.hである. .したがって,配列a[i]に1024個の乱数を格納するプログラムは次のようにする.

#include <stdlib.h>
#include <time.h>

int main(void){
  int a[1024], i;

  srand((unsigned int)time(NULL));

  for(i=0; i<1024; i++){
    a[i]=rand();
  }

  return 0;
}



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年5月23日


no counter