| 既に3ヶ月以上経っていますが、記録として書いておきます。
確率から実際に結果を導くためには、ランダム値を求めなければなりません。 SRCでは、Random関数を含めて恐らく線形合同法を用いてランダム値を算出しています。 このアルゴリズムは現在では欠陥が多く確認されており、値の偏りはさほど珍しくありません。特に値を二次元座標として使用すると、格子状に位置が偏ります。広いマップでユニットを数十体ほどランダムに出現させてみると、その偏りがわかると思います。 通常は目に見えた偏りはわからないかもしれませんが、改善法を取れば精度をより均一にすることが出来ます。
以下は精度を改善したランダムコマンドです。ただしクイックセーブファイルのサイズが肥大化するので、精度がそれほど重要でない場合は使わない方が良いでしょう。
----
#高精度ランダム用乱数プール作成 *プロローグ: Set _hires_rand_pool Set _rand_pool_size _rand_pool_size = 256 For i = 1 To _rand_pool_size _hires_rand_pool[i] = _MOD((Random(16777215) - 1) / (Random(16777215) - 1), 1) Next Exit
#整数高精度ランダム[1, UpperBound] #WRandom(UpperBound) WRandom: Return (Int((Args(1) - 1) * RRandom()) + 1)
#高精度ランダム[0, 1] #RRandom() RRandom: Local index = Random(_rand_pool_size) Local n = _hires_rand_pool[index] _hires_rand_pool[index] = _MOD((Random(16777215) - 1) / (Random(16777215) - 1), 1) Return n
#剰余 _MOD: Return (((Args(1) / Args(2)) - Int(Args(1) / Args(2))) * Args(2))
|