KAGのintrandomを使ってはならない

吉里吉里2/KAG3のintrandomは簡単に乱数が使えて便利ですが、デフォルトの状態ではバグがあります。例えば「@eval exp=”f.乱数 = intrandom(0, 5)”」とするとf.乱数は0以上5以下の数値になるはずですが、非常に稀に6になってしまいます。
これはtjsのMath.randomがバグっているためですが、吉里吉里2は既にメンテナンスされていないので多分修正されません。ということで自分で直しましょう。以下のスクリプトをOverride.tjsかAfterinit.tjsにコピーしておけば直ります。
[tjs]
// 0以上1未満の乱数を返す(Math.RandomGeneratorを使うように修正)
Math.random = function() {
if (Math.random.staticGenerator === void) {
Math.setSeed();
}
return Math.random.staticGenerator.random();
};
Math.random.staticGenerator = void;

// Math.randomのシードを設定
Math.setSeed = function(seed) {
if (seed === void) seed = System.getTickCount();
if (Math.random.staticGenerator === void) {
Math.random.staticGenerator = new Math.RandomGenerator(seed);
} else {
Math.random.staticGenerator.randomize(seed);
}
};
[/tjs]
Math.randomをMath.RandomGeneratorを使って計算する形に修正しています。Math.randomが直ればそれを使っているintrandomの動作も直ります。

コメントを残す

メールアドレスが公開されることはありません。