BONO's pageプログラム覚書

乱数の発生 [2004年1月]

- 関数による発生
  • stdlib.hをインクルードして,rand()を用いる
  • Cライブラリのrand関数は,直前のrand()の呼び出しで得られた乱数の値に適当な演算を施して,次の乱数を作成するようになっている.
  • 一番最初にrandを呼び出すとき,一般にsrand関数で乱数の初期値となる値を指定する.これを乱数の種という.
  • 乱数の種を適切に設定しないと,毎回同じ乱数を発生させることになる.
そこで,現在の時刻を与えることで毎回違う乱数になるように設定する例

     srand((unsigned)time(NULL)); //乱数の初期化
- 線形合同法による一様乱数
  • 適当な初期値X0から始め
    • Xn = ( A*Xn-1 + C ) mod M
  • という式を用いて,次々に0〜Mの範囲の値を発生させる.
    • Aは,8で割って余りが5の整数
    • Cは,奇数
    • Mは,2^n という条件で,0〜M−1 までの整数が周期Mで1回ずつ現れる.
- 実数乱数の発生
  • 線形合同法を使って,0〜1未満の実数乱数を発生させる関数の例
サンプルコード

#include        <stdio.h>
#include        <stdlib.h>
#include        <math.h>

double rnd(void)
{
    
unsigned rndnum=13;
    
rndnum=(rndnum*109+1021)%32768;
    
return rndnum/32767.1;
}
- 1〜Mまでの乱数を発生
    r=(int)(M*rand()/32767.1+1);
- 正規乱数(ボックス・ミュラー法)
  • 平均m,標準偏差σの正規分布N(m,σ)に従う乱数の発生例
サンプルコード
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void boxrnd(double m,double sig,double *x,double *y)
{
    double r1,r2;
    r1=rand()/32767.1;
    r2=rand()/32767.1;
    *x=sig*sqrt(-2*log(r1))*cos(2*3.14159*r2)+m;
    *y=sig*sqrt(-2*log(r1))*sin(2*3.14159*r2)+m;
}



[前画面に戻る]

Copyright(C)1998 Shinichi Takeshita.All Rights Reserved.