RANDOM(3) | FreeBSD Library Functions Manual | RANDOM(3) |
名称
random, srandom, srandomdev, initstate, setstate — 優れた乱数ジェネレータとジェネレータを変更するルーチンライブラリ
Standard C Library (libc, -lc)書式
#include < stdlib.h> long
random( void);
void
srandom( unsigned long seed);
void
srandomdev( void);
char *
initstate( unsigned long seed, char *state, long n);
char *
setstate( char *state);
解説
random() 関数は、非線形加法フィードバック乱数ジェネレータを使用し、デフォルトでサイズが 31 の long 整数のデフォルトテーブルを採用して、0 から (2**31)−1 までの範囲で連続した疑似乱数を戻します。この乱数ジェネレータの周期は非常に大きく、約 16*((2**31)−1) です。
random() と srandom() 関数は、 rand(3) と srand(3) 関数と (だいたい) 同じ呼び出し手順と初期化特性があります。 rand(3) が作成するランダム数列がかなり劣ったものであることです。実際、rand が作成する下位の 12 ビットは、循環パターンになります。 random() が作成するビットは、すべて有用です。たとえば‘ random()&01
’では、ランダムなバイナリ値が生成されます。
rand(3) と同じように、 random() は、種を‘ 1
’にして srandom() を呼び出すことにより複製できる、数値の数列をデフォルトで生成します。
srandomdev() ルーチンは、カーネルから取得される疑似ランダム数を使用して状態配列を初期化します。この特別の種まき手続きは、どのような値で srandom() を呼び出しても再生成できない状態を生成することに注意してください。なぜなら、状態バッファ内の連続する項は、固定の種に適用される LC アルゴリズムでは導出できないからです。
initstate() ルーチンは、引数として渡された状態配列を、後の使用のために初期化します。状態配列のサイズ (バイト単位) は、使用されるべき乱数ジェネレータがいかに高度 (複雑) かを決定するために、 initstate() で使われます。状態が多いと、乱数の質は、上がります。 (状態情報の量で現在「最適」な値は、 8、 32、64、128、256 バイトです。その他の量は、最も近い値に端数を切り捨て丸められます。 8 バイト未満の使用するとエラーとなります。) 初期化の種 (乱数数列の開始点を指定し、同じ点からの再開に備えます) も引数です。 initstate() 関数は、以前の状態情報配列へのポインタを戻します。
一旦、状態が初期化されたならば、 setstate() ルーチンは、状態間の迅速な切り替えに備えます。 setstate() 関数は、以前の状態配列へのポインタを戻します。その引数、状態配列は、次に initstate() または setstate() を呼び出すまで、さらに乱数を生成のために使用されます。
状態配列を初期化したら、 initstate() を (目的の種、状態配列、サイズで) 呼び出すか、または (状態配列で) setstate() と (目的の種で) srandom() の両方を呼び出すことで、異なる点から再開できます。 setstate() と srandom() の両方を呼び出す利点は、初期化された後、状態配列のサイズが記憶されないことです。
状態情報を 256 バイトにすると、乱数ジェネレータの周期は、ほとんどの目的に十分に対応できる 2**69 より大きくなります。
診断
状態情報を 8 バイトより小さくして initstate() を呼び出したり、状態情報が改ざんされたことを setstate() が検出したりすると、エラーメッセージが標準エラー出力に出力されます。歴史
これらの関数は、 4.2BSD で登場しました。作者
バグ
rand(3) の速度の約 2/3 です。歴史的な実装は、かつては非常に弱いシード (種) を使用していました。ランダム数列は、シード (種) であまり変わりませんでした。現在の実装は、初期状態の計算のために、よりよい疑似乱数ジェネレータを採用しています。
April 2, 2013 | FreeBSD |