.\" Copyright (c) 1983, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)random.3 8.1 (Berkeley) 6/4/93 .\" %FreeBSD: src/lib/libc/stdlib/random.3,v 1.11.2.5 2001/12/14 18:33:58 ru Exp % .\" $FreeBSD$ .\" .Dd June 4, 1993 .Dt RANDOM 3 .Os .Sh 名称 .Nm random , .Nm srandom , .Nm srandomdev , .Nm initstate , .Nm setstate .Nd 優れた乱数ジェネレータ、およびジェネレータを変更するルーチン .Sh ライブラリ .Lb libc .Sh 書式 .In stdlib.h .Ft long .Fn random void .Ft void .Fn srandom "unsigned long seed" .Ft void .Fn srandomdev void .Ft char * .Fn initstate "unsigned long seed" "char *state" "long n" .Ft char * .Fn setstate "char *state" .Sh 解説 .Fn random 関数は、非線形加法フィードバック乱数ジェネレータを使用し、 デフォルトでサイズが 31 の、ロング整数のテーブルを採用して、0 から .if t 2\u\s731\s10\d\(mi1 .if n (2**31)\(mi1 までの範囲で連続した疑似乱数を戻します。 この乱数ジェネレータの周期は非常に大きく、約 .if t 16\(mu(2\u\s731\s10\d\(mi1) .if n 16*((2**31)\(mi1) です。 .Pp .Fn random 関数と .Fn srandom 関数の呼び出し手順と初期化プロパティは、 .Xr rand 3 関数と .Xr srand 3 関数のものと (だいたい) 同じです。 違いは、 .Xr rand 3 が作成するランダムシーケンスがかなり劣ったものであることです。 実際、rand が作成する下位の多くのビットは、循環パターンになります。 .Fn random が作成するビットはすべて使用できます。 たとえば .Sq Li random()&01 では、ランダムなバイナリ値が作成されます。 .Pp .Xr rand 3 と同じように、 .Fn random は数値のシーケンスをデフォルトで作成します。 このシーケンスは、種を .Ql 1 にして .Fn srandom を呼び出すと再作成できます。 .Pp .Fn srandomdev ルーチンは、暗号化での使用に適した乱数を戻す .Xr urandom 4 乱数デバイスを使用し、状態配列を初期化します。 この初期化プロシージャは、どのような値で .Fn srandom を呼び出しても再作成できない状態を作成することに注意してください。 状態バッファ内の連続する項は、固定の種の場合に適用される LC アルゴリズムでは導出できないからです。 .Pp .Fn initstate ルーチンは、引数として渡された状態配列を、後の使用のために初期化します。 .Fn initstate は、状態配列のサイズ (バイト単位) を使用し、 乱数ジェネレータの複雑さを決定します。 状態を大きくすると、乱数の質は上がります。 (現在のところ、状態情報の量に「最適」な値は、8 バイト、32 バイト、 64 バイト、128 バイト、256 バイトです。 その他の値は、最も近い値に切り下げられます。 8 バイトより小さい値を使用するとエラーとなります。) 初期化の種 (乱数シーケンスの開始点を指定し、同じ点から再開できる) も引数です。 .Fn initstate 関数は、以前の状態情報配列へのポインタを戻します。 .Pp 状態を初期化したら、 .Fn setstate ルーチンで状態を素早く切り替えられます。 .Fn setstate 関数は、以前の状態配列へのポインタを戻します。 引数である状態配列は、次に .Fn initstate か .Fn setstate を呼び出すまで、さらに乱数を作成するのに使用されます。 .Pp 状態配列を初期化したら、 .Fn initstate を (目的の種、状態配列、サイズで) 呼び出すか、 もしくは (状態配列を指定した) .Fn setstate と (目的の種を指定した) .Fn srandom の両方を呼び出すことで、異なる点から再開できます。 .Fn setstate と .Fn srandom の両方を呼び出すと、状態配列のサイズを初期化した後で記憶する必要がない という長所が得られます。 .Pp 状態情報を 256 バイトにすると、乱数ジェネレータの周期は .if t 2\u\s769\s10\d .if n 2**69 より大きくなります。 この周期では、ほとんどの目的に十分に対応できます。 .Sh 作者 .An Earl T. Cohen .Sh 診断 状態情報を 8 バイトより小さくして .Fn initstate を呼び出したり、状態情報が歪められたことを .Fn setstate が検出したりすると、エラーメッセージが標準エラー出力に出力されます。 .Sh 関連項目 .Xr rand 3 , .Xr srand 3 , .Xr urandom 4 .Sh 歴史 この関数は、 .Bx 4.2 で登場しました。 .Sh バグ 処理速度は、 .Xr rand 3 の約 2/3 です。 .Pp 古い実装では初期化のプロセスが非常に弱く、 種を用いてもランダムシーケンスはあまり変わりませんでした。 現在のシステムは、より良い疑似乱数ジェネレータを 初期状態の算出に採用しています。