RAND48(3)

名称
drand48, erand48, lrand48, nrand48, mrand48, jrand48, srand48, seed48, lcong48 - 疑似乱数ジェネレータと初期化ルーチン

ライブラリ
libc

書式
<stdlib.h> double drand48(void) double erand48(unsigned short xseed[3]) long lrand48(void) long nrand48(unsigned short xseed[3]) long mrand48(void) long jrand48(unsigned short xseed[3]) void srand48(long seed) unsigned short * seed48(unsigned short xseed[3]) void lcong48(unsigned short p[7])

解説
rand48() ファミリの関数は、サイズが 48ビットの整数で動作する、一次的に一致した アルゴリズムを使用して疑似乱数を作成します。採用されている公式は r(n+1) = (a * r(n) + c) mod m で、被乗数 a のデフォルト値は 0xfdeece66d = 25214903917、加数 c のデフォ ルト値は 0xb = 11 です。法 m は、常に 2 ** 48 に固定されています。r(n) は、乱数ジェネレータの種を呼び出します。

以下で説明する 6つのジェネレータルーチンでは、最初の演算ステップでアル ゴリズムが 1回実行されます。

drand48() と erand48() は、ダブルタイプの値を戻します。r(n+1) の 48ビット全体は戻り値の仮数に ロードされ、指数は作成された値が区間[0.0, 1.0)に存在するように設定され ます。

lrand48() と nrand48() は、範囲[0, 2**31-1]でロングタイプの値を戻します。r(n+1) の上位(31)ビッ トは戻り値の下位ビットにロードされ、最上位(符号)ビットは 0に設定されます。

mrand48() と jrand48() は、範囲[-2**31, 2**31-1]でロングタイプの値を戻します。r(n+1)の上位 (32)ビットは、戻り値にロードされます。

drand48(), lrand48(), mrand48(), は、内部バッファを使用して r(n) を保存します。この関数では、r(0) の初 期値が 0x1234abcd330e = 20017429951246 になっています。

erand48(), nrand48(), jrand48() は、ユーザが指定したバッファを使用して r(n) を保存します。このバッファ は 3つのショートから構成されており、0番目のメンバには最下位ビットが入 ります。

すべての関数は、同じ被乗数と加数を共有します。

srand48() は、種の値の 32ビットを r(n) の上位 32ビットにコピーし、r(n)の下位 16 ビットを 0x330e に設定して、 drand48(), lrand48(), mrand48() の内部バッファ r(n) を初期化します。アルゴリズムの定被乗数と加数は、上 記のデフォルト値にリセットされます。

seed48() も drand48(), lrand48(), mrand48() の内部バッファ r(n) を初期化しますが、種の 48ビット全体が 3つのショー トの配列に指定され、0番目のメンバは最下位ビットを指定します。アルゴリ ズムの定被乗数と加数は、上記のデフォルト値にリセットされます。 seed48() は、古い種を含む、3つのショートの配列を指すポインタを戻します。この配 列は静的に割り振られるため、 seed48() を呼び出すたびに内容は失われます。

lcong48() では、 drand48(), erand48(), lrand48(), nrand48(), mrand48(), jrand48() で使用される被乗数と加数、および drand48(), lrand48(), mrand48() で使用される種を完全に制御できます。パラメータとしては、7つのショート の配列が渡されます。最初の 3つのショートは種の初期化に、次の 3つは被乗 数の初期化に、最後のショートは加数の初期化に使用されます。このため、 0xffff より大きい値を加数として使用することはできません。

乱数ジェネレータの種を作る 3つすべての手法は、6つのジェネレータの呼び 出し用に被乗数と加数を常に設定することに注意してください。

より強力な乱数ジェネレータが必要な場合は、 random(3) を使用してください。

作者
Martin Birgmeier

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