EN JA
RAND48(3)
RAND48(3) FreeBSD Library Functions Manual RAND48(3)

名称

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

ライブラリ

Standard C Library (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]);

解説

このマニュアルページに記述されている関数は、暗号的に安全ではありません。暗号アプリケーションは、代わりに arc4random(3) を使用するべきです。

rand48() 関数ファミリは、48ビットの整数のサイズで動作する、線形合同アルゴリズムを使用して疑似乱数を生成します。採用されている特別の公式は、 r(n+1) = (a * r(n) + c) mod m で、ここで被乗数 a のデフォルト値は、0x5deece66d = 25214903917、加数 c のデフォルト値は、0xb = 11 です。法 (モジュロ) m は、常に 2 ** 48 に固定されています。 r(n) は、乱数ジェネレータの種を呼び出します。

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

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

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

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

drand48(), lrand48() と mrand48() 関数は、r(n) を保存するために内部バッファを使用します。これら関数は、r(0) の値を 0x1234abcd330e = 20017429951246 で初期化します。

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

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

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

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

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

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

作者

Martin Birgmeier
September 4, 2012 FreeBSD