名 前
random, srandom, initstate, setstate − 乱 数 を 生 成 す る 関 数
書 式
#include <stdlib.h>
long int random(void);
void srandom(unsigned int seed);
char
*initstate(unsigned int seed, char
*state, size_t n);
char *setstate(char *state);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
random(), srandom(), initstate(), setstate():
_SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
説 明
random() 関 数 は 、 非 線 形 加 法 フ ィ ー ド バ ッ ク を 用 い た 乱 数 生 成 関 数 で あ る 。 こ の 関 数 は 、 0 か ら RAND_MAX ま で の 疑 似 乱 数 を 返 す 。 そ の た め に 31 個 の ロ ン グ 整 数 か ら な る デ フ ォ ル ト の 表 を 使 用 す る 。 こ の 乱 数 を 生 成 す る 関 数 の 周 期 は と て も 長 く 、 お よ そ 16 * ((2^31) − 1) で あ る 。
srandom() 関 数 は 、 random() で 返 さ れ る 疑 似 乱 数 整 数 系 列 の 種 を 設 定 す る 。 そ の た め に は 新 し い 種 を 引 数 に し て srandom() を 呼 べ ば よ い 。 random() で 生 成 さ れ る 系 列 は 、 引 数 に 同 じ 種 の 値 を 用 い て srandom() を 呼 ぶ こ と で 再 現 可 能 で あ る 。 種 の 値 が 与 え ら れ な い 場 合 に は random() 関 数 は 、 自 動 的 に 1 を 種 に 設 定 す る 。
initstate() 関 数 は 、 random() で 使 用 さ れ る 状 態 配 列 state を 初 期 化 す る 。 initstate() で は 、 状 態 配 列 の 大 き さ n は 使 用 す る 関 数 の 乱 数 生 成 の 性 能 の 程 度 を 決 定 す る た め に 使 用 さ れ る — 状 態 配 列 が 大 き い 程 、 乱 数 の 性 能 は よ く な る 。 seed は 初 期 化 の た め の 種 で あ る 。 こ れ は 乱 数 系 列 の 開 始 位 置 を 決 定 す る も の で あ り 、 こ の 値 を 指 定 す る こ と で 同 一 の 開 始 位 置 か ら 乱 数 の 生 成 を 再 開 す る こ と が で き る 。
setstate() 関 数 は 、 random() で 使 用 さ れ る 状 態 配 列 を 変 更 す る 。 状 態 配 列 state は 、 initstate() ま た は setstate() が 次 に 呼 び 出 さ れ る ま で 、 乱 数 の 生 成 に 使 用 さ れ る 。 state は initstate() を 用 い て 最 初 に 初 期 化 さ れ て い る か 、 以 前 に 呼 び 出 し た setstate() の 結 果 で な け れ ば な ら な い 。
返 り 値
関 数 random() と rand_r() は 0 以 上 RAND_MAX 以 下 の 数 を 返 す 。 関 数 srandom() は 値 を 返 さ な い 。 関 数 initstate() は 、 変 更 前 の 状 態 配 列 へ の ポ イ ン タ ー を 返 す 。 エ ラ ー の 場 合 、 errno に 原 因 を 示 す 値 が 設 定 さ れ る 。 関 数 setstate() は 、 成 功 す る と 0 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー の 原 因 を 示 す 値 が 設 定 さ れ る 。
エ ラ ー
EINVAL |
setstate() の 引 き 数 state が NULL で あ っ た 。 | ||
EINVAL |
initstate() で 8バ イ ト よ り も 小 さ い 状 態 配 列 を 指 定 し た 。 |
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 random(), srandom(), initstate(), setstate() は ス レ ッ ド セ ー フ で あ る 。
準 拠
4.3BSD, POSIX.1−2001.
注 意
状 態 配 列 n の 大 き さ の 現 在 の 「 最 適 」 値 は 8、 32、 64、 128、 256 バ イ ト で あ る 。 そ の 他 の 量 を 指 定 し た 場 合 に は 、 指 定 し た 量 を 越 え な い 上 述 の 値 に 最 も 近 い 値 に な る 。 8 バ イ ト 未 満 の 量 を 指 定 し た 場 合 に は エ ラ ー の 原 因 と な る 。 複 数 の ス レ ッ ド が random() を 使 う よ う な 状 況 で は 、 こ の 関 数 を 使 用 す べ き で は な い 。 そ の 場 合 に は random_r(3) を 使 う こ と 。 乱 数 の 生 成 は 複 雑 な 話 題 で あ る 。 Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 2007, 3rd ed.) で は 実 用 的 な 乱 数 生 成 を 論 点 と し た 優 れ た 議 論 が 第 7 章 (乱 数 ) で 展 開 さ れ て い る 。 よ り 理 論 的 な 議 論 に つ い て は Donald E. Knuth の The Art of Computer Programming, volume 2 (Seminumerical Algorithms), 2nd ed.; Reading, Massachusetts: Addison−Wesley Publishing Company, 1981 の 第 3 章 (乱 数 ) を 見 よ 。 こ こ で は 、 た く さ ん の 実 用 的 な 話 題 に つ い て も 深 く 網 羅 さ れ て い る 。
バ グ
POSIX で は 、 エ ラ ー 時 に initstate() は NULL を 返 す べ き と さ れ て い る 。 glibc の 実 装 で は 、 エ ラ ー 時 に errno は 仕 様 通 り に 設 定 さ れ る が 、 関 数 の 返 り 値 は NULL で は な い 。
関 連 項 目
drand48(3), getrandom(2), rand(3), random_r(3), srand(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。