名 前
drand48, erand48, lrand48, nrand48, mrand48, jrand48, srand48, seed48, lcong48 − 一 様 分 布 す る 疑 似 乱 数 を 生 成 す る 関 数
書 式
#include <stdlib.h>
double drand48(void);
double erand48(unsigned short xsubi[3]);
long int lrand48(void);
long int nrand48(unsigned short xsubi[3]);
long int mrand48(void);
long int jrand48(unsigned short xsubi[3]);
void srand48(long int seedval);
unsigned short *seed48(unsigned short seed16v[3]);
void lcong48(unsigned short param[7]);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ): 上 記 の 全 て の 関 数 : _SVID_SOURCE || _XOPEN_SOURCE
説 明
こ れ ら の 関 数 は 線 形 合 同 ア ル ゴ リ ズ ム と 48ビ ッ ト 整 数 演 算 を 用 い て 疑 似 乱 数 を 生 成 す る 。 関 数 drand48() と erand48() は 、 区 間 [0.0, 1.0) で 一 様 分 布 す る 非 負 の 倍 精 度 浮 動 小 数 点 実 数 値 を 返 す 。 関 数 lrand48() と nrand48() は 0 と 2^31 の 間 で 一 様 分 布 す る 非 負 の ロ ン グ 整 数 を 返 す 。 関 数 mrand48() と jrand48() は −2^31 と 2^31 の 間 で 一 様 分 布 す る 符 号 付 き ロ ン グ 整 数 を 返 す 。 関 数 srand48(), seed48(), lcong48() は 初 期 化 関 数 で あ る 。 関 数 drand48(), lrand48(), mrand48() を 使 用 す る 前 に 、 こ れ ら の 初 期 化 関 数 の い ず れ か を 呼 ぶ べ き で あ る 。 関 数 erand48(), nrand48(), jrand48() は 初 め に 初 期 化 関 数 を 呼 ぶ こ と を 必 要 と し な い 。 こ こ で 説 明 し て い る す べ て の 関 数 は 48ビ ッ ト の 整 数 の シ ー ケ ン ス (Xi) を 生 成 す る こ と で 機 能 し て い る 。 生 成 方 法 は 以 下 の 線 形 合 同 の 式 に よ る 。
Xn+1 = (aXn + c) mod m, こ こ でn >= 0 で あ る 。 パ ラ メ ー タ ー が m = 2^48 で あ る た め 、 48ビ ッ ト 整 数 演 算 が 行 わ れ て い る 。 lcong48() が 呼 ば れ て い な い 場 合 、 a と c は 以 下 の 式 で 与 え ら れ る 。
a =
0x5DEECE66D
c = 0xB 関 数drand48(),
erand48(), lrand48(), nrand48(),
mrand48(), jrand48() で 返
さ れ る 値 は 次
の よ う に し て
計 算 さ れ る 。
は じ め に 、 次
の 48ビ ッ ト の Xi
が 計 算 さ れ る
。 そ し て 、 返
す べ き デ ー タ
の 型 に 依 存 し
た 適 切 な ビ ッ
ト 数 が Xi の 上
位 ビ ッ ト か ら
コ ピ ー さ れ る
。 最 後 に 、 こ
の 値 を 返 り 値
に 変 換 す る 。
関 数 drand48(), lrand48(),
mrand48() は 最 後 に
生 成 さ れ た 48ビ
ッ ト の Xi を 内
部 バ ッ フ ァ ー
に 格 納 す る 。
配 列 の 形 の 引
数 xsubi に 個 々 の
Xi の 値 を 格 納
で き る よ う な
領 域 を 確 保 す
る こ と を 、 関
数 erand48(), nrand48(),
jrand48() は 、 呼 び
出 し 側 の プ ロ
グ ラ ム に 要 求
す る 。 こ れ ら
の 関 数 は 、 は
じ め て そ れ ら
の 関 数 を 呼 ぶ
前 に Xi の 初 期
値 を 配 列 に 代
入 す る こ と で
初 期 化 さ れ る
。 初 期 化 関 数
srand48() は 、 Xi の
上 位 32ビ ッ ト を
引 数 seedval に 設 定
す る 。 下 位 の
16ビ ッ ト は 、 適
当 に 決 め ら れ
た 値 で あ る 0x330Eに
設 定 さ れ る 。
初 期 化 関 数 seed48()
は 、 Xi の 値 を
、 配 列 の 形 を
し た 引 数 で あ
る seed16v の 中 で 指
定 さ れ た 48ビ ッ
ト の 値 に 設 定
す る 。 Xi の 前
の 値 は 内 部 バ
ッ フ ァ ー に コ
ピ ー さ れ 、 こ
の バ ッ フ ァ ー
へ の ポ イ ン タ
ー が seed48() に よ っ
て 返 さ れ る 。
初 期 化 関 数
lcong48() は 使 用 者
が Xi, a, c の 初
期 値 を 指 定 す
る た め の 関 数
で あ る 。 配 列
の 形 を し た 引
数 の 要 素 は そ
れ ぞ れ 、 param[0−2]
は Xi を 、 param[3−5]
は a を 、 param[6] は
c を 指 定 す る
も の で あ る 。
lcong48() が 呼 ば れ
た 後 で 、 srand48()
か seed48() を 呼 ぶ と
、 前 述 の a と
c の 標 準 値 が
再 び 設 定 さ れ
る 。
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 drand48(), erand48(), lrand48(), nrand48(), mrand48(), jrand48(), srand48(), seed48(), lcong48() は 、 乱 数 生 成 に 使 用 す る 状 態 情 報 を グ ロ ー バ ル に 保 持 す る 。 そ の た め 、 こ れ ら の 関 数 は ス レ ッ ド セ ー フ で は な い 。
準 拠
SVr4, POSIX.1−2001.
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。