rparam()
2009/05/22に書いた、0付近の非対称の原因がrparam()にあることを実際に確認した。
Bonanza 4.0.4で、dv==0のときにはistepの更新をしないで、乱数の効果分だけ更新するように書き換える。
static void rparam( short *pv, float dv, int istep ) { int v, r; v = *pv; r = brand() + brand() - 1; if ( v > 0 ) { dv -= (float)FV_PENALTY; } else if ( v < 0 ) { dv += (float)FV_PENALTY; } if (dv == 0.0) { if (r > 0) { if (v <= SHRT_MAX - r) { v += r; } else { warn: out_warning( "A fvcoef parameter is out of bounce.\n" ); } } else if (r < 0) { if (v >= SHRT_MIN - r) { v += r; } else goto warn; } } else { istep += r; if (dv > 0.0) { if (v <= SHRT_MAX - istep ) { v += istep; } else goto warn; } else { if (v >= SHRT_MIN + istep ) { v -= istep; } else goto warn; } } *pv = (short)v; }
初期状態から1回iterationした結果は、以下のようになった。(newが書き換えた側)
やはりrparam()が原因だった。
value | original | new |
---|---|---|
-5 | 0.15% | 0.15% |
-4 | 0.14% | 0.14% |
-3 | 0.44% | 0.46% |
-2 | 4.52% | 4.76% |
-1 | 18.46% | 22.93% |
0 | 32.57% | 37.01% |
1 | 26.76% | 22.68% |
2 | 9.29% | 4.61% |
3 | 0.87% | 0.44% |
4 | 0.15% | 0.14% |
5 | 0.15% | 0.15% |
value | original | new |
---|---|---|
-5 | 0.17% | 0.16% |
-4 | 0.16% | 0.16% |
-3 | 0.46% | 0.48% |
-2 | 4.52% | 4.85% |
-1 | 18.70% | 24.61% |
0 | 33.18% | 39.11% |
1 | 27.45% | 22.06% |
2 | 9.63% | 3.37% |
3 | 0.91% | 0.35% |
4 | 0.16% | 0.16% |
5 | 0.17% | 0.17% |