rand()関数の乱数種について質問です。
rand()関数は同一の乱数種からは同一の乱数列を生成することは規格で決まって
いるようですが、プロセスやPCが異なっていてもそれは成り立つのでしょうか。
つまり、複数のPCで同一ビルドのアプリケーションを走らせる時、あるひとつの
アプリケーションから他のアプリケーションに乱数の種を送りつけ、それぞれ
srand()し、処理を開始します。それ以降の各アプリ内で発生される乱数列が同
一であることは保証されるのでしょうか。
よろしくお願いします。
--
*--------------------------------------------*
田中 慈郎 TANAKA Jiro
<mailto:jta...@cslab.co.jp>
株式会社シーズ・ラボ
<http://www.cslab.co.jp> TEL 011-758-3820
〒060-0807 札幌市北区北7条西6丁目1番地
北苑ビル
*--------------------------------------------*
In article <3C1F097D...@cslab.co.jp>
Jiro TANAKA <jta...@cslab.co.jp> writes:
> rand()関数は同一の乱数種からは同一の乱数列を生成することは規格で決まって
> いるようですが、プロセスやPCが異なっていてもそれは成り立つのでしょうか。
ANSI+ISO+IEC+9899-1999.pdf の 7.20.2.2 The srand function には、
If srand is then called with the same seed value,
the sequence of pseudo-random numbers shall be repeated.
とあるので、同一のプロセスで複数回呼んだ場合しか保証されてない
ような気がします。
# JIS X 3010-1993 の 7.10.2.2 srand 関数 には、「srand を同じ
# 種の値で呼んだ場合、同じ疑似乱数列を生成しなければならない。」
# とありますけどね...
> つまり、複数のPCで同一ビルドのアプリケーションを走らせる時、あるひとつの
> アプリケーションから他のアプリケーションに乱数の種を送りつけ、それぞれ
> srand()し、処理を開始します。それ以降の各アプリ内で発生される乱数列が同
> 一であることは保証されるのでしょうか。
普通は、同じ処理系 (同じバージョンのコンパイラとライブラリ)
であれば、同じ乱数列が生成されると期待して良いと思いますが、
「保証」と言われるとちょっと...
# ちなみに、同一ビルドのアプリケーションでも、rand や srand を
# 含むライブラリが dynamic link されている場合、その .dll の
# バージョンがちょっとでも違えば乱数列も変わる可能性があります。
ほし
> ANSI+ISO+IEC+9899-1999.pdf の 7.20.2.2 The srand function には、
>
> If srand is then called with the same seed value,
> the sequence of pseudo-random numbers shall be repeated.
>
> とあるので、同一のプロセスで複数回呼んだ場合しか保証されてない
> ような気がします。
>
> # JIS X 3010-1993 の 7.10.2.2 srand 関数 には、「srand を同じ
> # 種の値で呼んだ場合、同じ疑似乱数列を生成しなければならない。」
> # とありますけどね...
乱数生成の式中に、srand()で設定されたパラメータとrand()を呼んだ回数以外のパラ
メータが登場してはいけない、というような決まりがあると嬉しいんですけどね。
ただ、その場合でも
> # ちなみに、同一ビルドのアプリケーションでも、rand や srand を
> # 含むライブラリが dynamic link されている場合、その .dll の
> # バージョンがちょっとでも違えば乱数列も変わる可能性があります。
こっちは十分に考えられそうです。
#乱数の精度を求めるようなアプリではないので、
#自前で乱数生成の関数を作ってしまった方が手っ取り早いかも
> rand()関数の乱数種について質問です。
> rand()関数は同一の乱数種からは同一の乱数列を生成することは規格で決まって
> いるようですが、プロセスやPCが異なっていてもそれは成り立つのでしょうか。
これは、私の知識では分かりません。
> つまり、複数のPCで同一ビルドのアプリケーションを走らせる時、あるひとつの
> アプリケーションから他のアプリケーションに乱数の種を送りつけ、それぞれ
> srand()し、処理を開始します。それ以降の各アプリ内で発生される乱数列が同
> 一であることは保証されるのでしょうか。
求める仕様の関数を自分で作った方が確実だと思います。
擬似乱数作成のアルゴリズムは、たぶん、サーチエンジンで検索したり、
アルゴリズムの本を調べたりすれば、分かるのではないかと思います。
あやふやですみません。
--
熊谷 勝浩 kuma...@smile.ocn.ne.jp
有限会社パルコム TEL 0226-24-6090 FAX 0226-24-5114
〒988-0053 宮城県気仙沼市田中前2-8-7