吉里吉里2/Z 乱数不具合
吉里吉里2(TJS2)をgccでコンパイルしようとしても発生する潜在的不具合だけど、そもそもコンパイル通らないだろうし、考慮もほとんどされていないから、吉里吉里Zの問題だな……
2015-02-24 15:52:36Math.randomの見て最初に思ったんだけど、みんなMath.RandomGeneratorの方しか使わないと勝手に思ってた。まあ、暫定とかでMath.random使うことはあるとしても、リリースする版には入れないとか言う勝手な認識。
2015-02-24 16:16:49@jin1016 自分もRandomGenerator使ってますが,KAG由来のUtils.tjsにあるintrandomとかrandomプロパティはMath.random実装ですね・・・
2015-02-24 16:20:38Math.randomが使われるのなら乱数の周期などがコンパイラによって変わってしまうのは好ましくないかもしれないなぁ。xorshiftなどに置き換えてしまった方がいいかも
2015-02-24 16:20:57@jin1016 @nyanyashi *result = ((tTVReal)((tTVReal)TJS_rand()/(tTVReal)(TJS_RAND_MAX))); これは確かに1が出る。
2015-02-24 17:43:21@jin1016 @nyanyashi 「1未満」にしようと思ったら、 こうですかね。 *result = ((tTVReal)((tTVReal)TJS_rand()/((tTVReal)(TJS_RAND_MAX)+1)));
2015-02-24 17:44:44@yunyundetective @nyanyashi ほぼ同じpull requestが来ています。 github.com/krkrz/krkrz/pu… 吉里吉里2では出ないと言うので、色々とソースコード追ったりしていました。
2015-02-24 17:46:31@jin1016 @nyanyashi 配列からのランダムセレクションに使うと範囲外アクセスでエラーが出るパターンがありますねえ。
2015-02-24 17:49:16@jin1016 @nyanyashi ちなみにMTのRandomGeneratorのソースでは、浮動小数点のビットパターン自体に乱数を埋め込んで理論上あり得る「0以上1未満」の数のどれかを作るアルゴリズムになっているので問題ないようです。
2015-02-24 17:48:29@jin1016 @yunyundetective すんごい確率低いですからね…1104774470回目と1510578330回目で出ましたいまのところ。
2015-02-24 17:48:59@nyanyashi @jin1016 RAND_MAXって環境によって値が違うのですがその分だと吉里吉里のBC環境だと 0x7FFFFFFF くらいあるですかね?
2015-02-24 17:50:00@nyanyashi @yunyundetective 数が多すぎてパッと見てわからないですねw 吉里吉里2の_lrandは2^64周期と言うことなので長いです。
2015-02-24 17:50:18吉里吉里2 では、bcc の _lrand が使われているので、Math.randum() は 2^64周期。吉里吉里Z は、vc の rand だから 16ビットくらいかな
2015-02-24 17:51:47