148 lines
3.9 KiB
Groff
148 lines
3.9 KiB
Groff
.\" Copyright (c) 1993 Martin Birgmeier
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" You may redistribute unmodified or modified versions of this source
|
|
.\" code provided that the above copyright notice and this and the
|
|
.\" following conditions are retained.
|
|
.\"
|
|
.\" This software is provided ``as is'', and comes with no warranties
|
|
.\" of any kind. I shall in no event be liable for anything that happens
|
|
.\" to anyone/anything when using this software.
|
|
.\"
|
|
.\" @(#)rand48.3 V1.0 MB 8 Oct 1993
|
|
.\" %FreeBSD: src/lib/libc/gen/rand48.3,v 1.8.2.5 2001/12/14 18:33:51 ru Exp %
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.Dd October 8, 1993
|
|
.Dt RAND48 3
|
|
.Os
|
|
.Sh 名称
|
|
.Nm drand48 ,
|
|
.Nm erand48 ,
|
|
.Nm lrand48 ,
|
|
.Nm nrand48 ,
|
|
.Nm mrand48 ,
|
|
.Nm jrand48 ,
|
|
.Nm srand48 ,
|
|
.Nm seed48 ,
|
|
.Nm lcong48
|
|
.Nd 疑似乱数ジェネレータと初期化ルーチン
|
|
.Sh ライブラリ
|
|
.Lb libc
|
|
.Sh 書式
|
|
.In stdlib.h
|
|
.Ft double
|
|
.Fn drand48 void
|
|
.Ft double
|
|
.Fn erand48 "unsigned short xseed[3]"
|
|
.Ft long
|
|
.Fn lrand48 void
|
|
.Ft long
|
|
.Fn nrand48 "unsigned short xseed[3]"
|
|
.Ft long
|
|
.Fn mrand48 void
|
|
.Ft long
|
|
.Fn jrand48 "unsigned short xseed[3]"
|
|
.Ft void
|
|
.Fn srand48 "long seed"
|
|
.Ft "unsigned short *"
|
|
.Fn seed48 "unsigned short xseed[3]"
|
|
.Ft void
|
|
.Fn lcong48 "unsigned short p[7]"
|
|
.Sh 解説
|
|
.Fn rand48
|
|
ファミリの関数は、サイズが 48ビットの整数で動作する、一次的に一致した
|
|
アルゴリズムを使用して疑似乱数を作成します。採用されている公式は
|
|
r(n+1) = (a * r(n) + c) mod m
|
|
で、被乗数 a のデフォルト値は 0xfdeece66d = 25214903917、加数 c のデフォ
|
|
ルト値は 0xb = 11 です。法 m は、常に 2 ** 48 に固定されています。r(n)
|
|
は、乱数ジェネレータの種を呼び出します。
|
|
.Pp
|
|
以下で説明する 6つのジェネレータルーチンでは、最初の演算ステップでアル
|
|
ゴリズムが 1回実行されます。
|
|
.Pp
|
|
.Fn drand48
|
|
と
|
|
.Fn erand48
|
|
は、ダブルタイプの値を戻します。r(n+1) の 48ビット全体は戻り値の仮数に
|
|
ロードされ、指数は作成された値が区間[0.0, 1.0)に存在するように設定され
|
|
ます。
|
|
.Pp
|
|
.Fn lrand48
|
|
と
|
|
.Fn nrand48
|
|
は、範囲[0, 2**31-1]でロングタイプの値を戻します。r(n+1) の上位(31)ビッ
|
|
トは戻り値の下位ビットにロードされ、最上位(符号)ビットは 0に設定されます。
|
|
.Pp
|
|
.Fn mrand48
|
|
と
|
|
.Fn jrand48
|
|
は、範囲[-2**31, 2**31-1]でロングタイプの値を戻します。r(n+1)の上位
|
|
(32)ビットは、戻り値にロードされます。
|
|
.Pp
|
|
.Fn drand48 ,
|
|
.Fn lrand48 ,
|
|
.Fn mrand48 ,
|
|
は、内部バッファを使用して r(n) を保存します。この関数では、r(0) の初
|
|
期値が 0x1234abcd330e = 20017429951246 になっています。
|
|
.Pp
|
|
.Fn erand48 ,
|
|
.Fn nrand48 ,
|
|
.Fn jrand48
|
|
は、ユーザが指定したバッファを使用して r(n) を保存します。このバッファ
|
|
は 3つのショートから構成されており、0番目のメンバには最下位ビットが入
|
|
ります。
|
|
.Pp
|
|
すべての関数は、同じ被乗数と加数を共有します。
|
|
.Pp
|
|
.Fn srand48
|
|
は、種の値の 32ビットを r(n) の上位 32ビットにコピーし、r(n)の下位 16
|
|
ビットを 0x330e に設定して、
|
|
.Fn drand48 ,
|
|
.Fn lrand48 ,
|
|
.Fn mrand48
|
|
の内部バッファ r(n) を初期化します。アルゴリズムの定被乗数と加数は、上
|
|
記のデフォルト値にリセットされます。
|
|
.Pp
|
|
.Fn seed48
|
|
も
|
|
.Fn drand48 ,
|
|
.Fn lrand48 ,
|
|
.Fn mrand48
|
|
の内部バッファ r(n) を初期化しますが、種の 48ビット全体が 3つのショー
|
|
トの配列に指定され、0番目のメンバは最下位ビットを指定します。アルゴリ
|
|
ズムの定被乗数と加数は、上記のデフォルト値にリセットされます。
|
|
.Fn seed48
|
|
は、古い種を含む、3つのショートの配列を指すポインタを戻します。この配
|
|
列は静的に割り振られるため、
|
|
.Fn seed48
|
|
を呼び出すたびに内容は失われます。
|
|
.Pp
|
|
.Fn lcong48
|
|
では、
|
|
.Fn drand48 ,
|
|
.Fn erand48 ,
|
|
.Fn lrand48 ,
|
|
.Fn nrand48 ,
|
|
.Fn mrand48 ,
|
|
.Fn jrand48
|
|
で使用される被乗数と加数、および
|
|
.Fn drand48 ,
|
|
.Fn lrand48 ,
|
|
.Fn mrand48
|
|
で使用される種を完全に制御できます。パラメータとしては、7つのショート
|
|
の配列が渡されます。最初の 3つのショートは種の初期化に、次の 3つは被乗
|
|
数の初期化に、最後のショートは加数の初期化に使用されます。このため、
|
|
0xffff より大きい値を加数として使用することはできません。
|
|
.Pp
|
|
乱数ジェネレータの種を作る 3つすべての手法は、6つのジェネレータの呼び
|
|
出し用に被乗数と加数を常に設定することに注意してください。
|
|
.Pp
|
|
より強力な乱数ジェネレータが必要な場合は、
|
|
.Xr random 3
|
|
を使用してください。
|
|
.Sh 作者
|
|
.An Martin Birgmeier
|
|
.Sh 関連項目
|
|
.Xr rand 3 ,
|
|
.Xr random 3
|