DRAND48(3)

名前
drand48, erand48, lrand48, nrand48, mrand48, jrand48, srand48, seed48, lcong48 - 一様分布する疑似乱数を生成する関数

書式
#include <stdlib.h>

double drand48(void);

double erand48(unsigned short int xsubi[3]);

long int lrand48(void);

long int nrand48(unsigned short int xsubi[3]);

long int mrand48(void);

long int jrand48(unsigned short int xsubi[3]);

void srand48(long int seedval);

unsigned short int *seed48(unsignedshortint seed16v [3]);

void lcong48(unsigned short int param[7]);

説明
これらの関数は線形合同アルゴリズムと48ビット整数演算を用いて 疑似乱数を生成する。

drand48()関数とerand48()関数は、区間[0.0, 1.0)で 一様分布する非負の倍精度浮動小数点実数値を返す。

lrand48()関数とnrand48()関数は0と2^31の間で一様分布する 非負のロング整数を返す。

mrand48()関数とjrand48()関数は -2^31と2^31の間で一様分布する符号付きロング整数を返す。

srand48()関数seed48()関数そしてlcong48()関数は初期化関数 である。 drand48()関数lrand48()関数またはmrand49()を 使用する前に、これらの初期化関数のいずれかを呼ぶべきである。 関数 erand48()、nrand48()そしてjrand48()は初めに 初期化関数を呼ぶことを必要としない。

ここで説明しているすべての関数は48ビットの整数の シーケンス(Xi)を生成することで 機能している。生成方法は以下の線形合同の式による。

    Xn+1 = (aXn + c) mod m,

ここで n >= 0 である。 パラメータがm = 2^48であるため、48ビット整数演算が行われている。 lcong48()が呼ばれていない場合、aとcは以下の式で与えられる。

    a = 0x5DEECE66D
    c = 0xB

関数drand48()、erand48()、lrand48()、nrand48()、 mrand48()そしてjrand48()で返される値は次のようにして計算される。 はじめに、次の48ビットのXiが計算される。 そして、返すべきデータの型に依存した適切な ビット数がXiの上位ビットからコピーされる。 最後に、この値を返り値に変換する。

関数drand48()、lrand48()、mrand48()は 最後に生成された48ビットのXiを内部バッファに格納する。 配列の形の引数xsubiに個々のXiの値を 格納できるような領域を確保することを、 関数erand48()、nrand48()そしてjrand48()は、 呼び出し側のプログラムに要求する。 これらの関数は、はじめてそれらの関数を呼ぶ前にXiの初期値を配列に 代入することで初期化される。

初期化関数srand48()は、Xiの 上位32ビットを引数seedvalに設定する。 下位の16ビットは、適当に決められた値である0x330Eに設定される。

初期化関数seed48()は、Xiの値を、 配列の形をした引数であるseed16vの中で指定された48ビットの値に設定する。 Xiの前の値は内部バッファにコピーされ、このバッファへのポインタが seed48()によって返される。

初期化関数lcong48()は使用者がXi、aそしてcの 初期値を指定するための関数である。 配列の形をした引数の要素はそれぞれ、param[0-2]はXiを、 param[3-5]はaを、そしてparam[6]はcを指定するもの である。 lcong48()が呼ばれた後で、 srand48()またはseed48()を呼ぶと、前述のaとcの 標準値が再び設定される。

準拠
SVID 3

注意事項
これらの関数はSVID 3によって時代遅れと宣言されている。 SVID 3はrand(3)が代わりに使用されるべきだと記述している。

関連事項
rand(3), random(3)