魚の価値計算
魚の価値計算
釣り上げたさかなの価値は、サイズをそのまま金額に換算するのではなく、そのさかな種の中でどれくらい大きい個体だったかという相対的な位置から決まります。このページでは価値が求まるまでの流れを説明し、サイズ範囲と数式を変えたときの傾向をシミュレーターで確かめられるようにしています。
数式そのものの書き方は レアリティ と さかな の定義を参照してください。
価値が決まるまでの流れ
価値は次の 3 段階で決定されます。
- さかな定義の
sizeに書かれた最小値minと最大値maxから、平均mid = (min + max) / 2、標準偏差sd = (max - min) / 6の正規分布を組み立てます。 - その正規分布の累積分布関数に釣り上げたサイズを通し、0 から 1 の値を求めます。これが変数
length_rateの値で、釣果 (Fish/CaughtFish) のlengthRateでも参照できます。最小サイズ付近なら 0 に近く、最大サイズ付近なら 1 に近づきます。 - 適用する数式の変数
length_rateにその値を入れて評価した結果を価値とします。
累積分布関数は Abramowitz-Stegun の近似式による誤差関数を使って計算しているため、厳密な正規分布の値とはわずかにずれます。表示される値は近似値だと考えてください。
適用される数式
数式は次の順で探索されます。
- さかな定義の
worthがnullでなければ、それが最優先で使われます。 - さかな側に指定が無ければ、そのさかなのレアリティの
worthが使われます。レアリティのworthは必須です。
数式の評価には exp4j を使っています。四則演算のほか、^ による累乗や sin / cos / log / sqrt などの関数が利用できます。使える変数は length_rate だけです。
数式は読み込み時に検証されます。構文が不正な数式や length_rate 以外の変数を使った数式を書いたさかな・レアリティのファイルは、警告を出してスキップされます。
注意
累乗は ^ で書きます。** は exp4j の文法では解釈されず、そのファイルは読み込み時にスキップされます。レアリティの構成例 も "(length_rate ^ 2) * 5 + 5" のように ^ を使っています。
サイズの抽選と価値の分布
釣り上げるサイズ自体も、価値の計算と同じ mid と sd を持つ正規分布から抽選され、その結果を min から max の範囲へ丸めて決まります。範囲外に出た値は切り捨てられずに端の値へ寄せられるため、実測では最小値と最大値ちょうどの個体が理論上の正規分布より多く出ます。
算出された価値と累積分布関数の値は、釣果 (CaughtFish) の worth と lengthRate としてイベントと魚アイテムに渡されます。
シミュレーター
サイズ には、さかな定義の size に相当する最小値と最大値を入力します。レアリティ を切り替えると、そのレアリティに対応する数式で価値が再計算されます。表の CDF 累積分布関数 の列が、そのサイズでの length_rate の値です。
(length_rate ^ 2) * 5 + 5| サイズ | スコア | CDF 累積分布関数 |
|---|---|---|
| 20.00 cm | 5.00 | 0.13 % |
| 24.00 cm | 5.00 | 0.82 % |
| 28.00 cm | 5.01 | 3.59 % |
| 32.00 cm | 5.07 | 11.51 % |
| 36.00 cm | 5.38 | 27.43 % |
| 40.00 cm | 6.25 | 50.00 % |
| 44.00 cm | 7.63 | 72.57 % |
| 48.00 cm | 8.92 | 88.49 % |
| 52.00 cm | 9.65 | 96.41 % |
| 56.00 cm | 9.92 | 99.18 % |
| 60.00 cm | 9.99 | 99.87 % |
シミュレーターはあくまで傾向をつかむためのものです。レアリティと数式はコンポーネントに直接書かれた初期状態のものなので、rarity/*.json を編集していると実際の計算と一致しません。サイズの初期値もシミュレーター用の値で、さかな定義の size は必須です。