スポンサーリンク

RAND48(3) FreeBSD ライブラリ関数マニュアル RAND48(3)

名称

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

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <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)

FreeBSD 10.0 October 8, 1993 FreeBSD 10.0

スポンサーリンク