収穫量

バージョン: industrialcraft-2-2.2.731-experimental

概要

y=chanceにおける、x=収穫個数に対するz=出現比。

収穫(旧収穫記事)に関する記事。収穫物が得られる量について言及する。

収穫物の量は、chance・dropCount・収穫物の量という3段階の計算により求まる。最終的な式はMaxima用のコードとして提供する。

 

アルゴリズム

収穫量を決定するアルゴリズムは、harvest_automatedに存在する。以下に、本記事で説明する各計算項目の名称を定義しながらアルゴリズムを載せる。

dropGainChanceに、1.03^Gainを乗算(Gain倍率し、変数chanceに代入する。
平均がchance、標準偏差が0.6827*chanceの正規分布を示す乱数を生成し、四捨五入したあと0未満なら0にした奴をdropCountに代入する。
dropCountの数だけ
getGainを呼び出して、戻り値をItemStack配列のretに代入する。
retの各要素に対して、nullでなければ(gain+1)/100の確率でスタックの個数を1増やす。(Gain補正

chanceの算出

chanceは、dropGainChanceにGain倍率をかけて導出する。

dropGainChanceの算出

これはCropCardのメソッドであるため、植物種によってまちまちである

ただし、CropCardデフォルトの実装が決まっており、それは0.95のtier乗である。大多数の植物種はこれに従う。以下に対応表を載せる。

Tier 0.95^Tier Tier 0.95^Tier Tier 0.95^Tier Tier 0.95^Tier
0 1 16 0.440127 32 0.193711 48 0.085258
1 0.95 17 0.41812 33 0.184026 49 0.080995
2 0.9025 18 0.397214 34 0.174825 50 0.076945
3 0.857375 19 0.377354 35 0.166083 51 0.073098
4 0.814506 20 0.358486 36 0.157779 52 0.069443
5 0.773781 21 0.340562 37 0.14989 53 0.065971
6 0.735092 22 0.323534 38 0.142396 54 0.062672
7 0.698337 23 0.307357 39 0.135276 55 0.059539
8 0.66342 24 0.291989 40 0.128512 56 0.056562
9 0.630249 25 0.27739 41 0.122087 57 0.053734
10 0.598737 26 0.26352 42 0.115982 58 0.051047
11 0.5688 27 0.250344 43 0.110183 59 0.048495
12 0.54036 28 0.237827 44 0.104674 60 0.04607
13 0.513342 29 0.225936 45 0.09944 61 0.043766
14 0.487675 30 0.214639 46 0.094468 62 0.041578
15 0.463291 31 0.203907 47 0.089745 63 0.039499

Gain倍率

1.03のGain乗である。以下に対応表を載せる。

Gain 1.03^Gain Gain 1.03^Gain
0 1 16 1.604706
1 1.03 17 1.652848
2 1.0609 18 1.702433
3 1.092727 19 1.753506
4 1.125509 20 1.806111
5 1.159274 21 1.860295
6 1.194052 22 1.916103
7 1.229874 23 1.973587
8 1.26677 24 2.032794
9 1.304773 25 2.093778
10 1.343916 26 2.156591
11 1.384234 27 2.221289
12 1.425761 28 2.287928
13 1.468534 29 2.356566
14 1.51259 30 2.427262
15 1.557967 31 2.50008

dropCountの算出

期待値を得たいが、正規分布を標本化した上に負部分を0に切り捨てているためこれがまた面倒臭い。

普通の数式を出しても手作業で扱うのはだるいので、Maxima用の数式で説明する。

以下で出現する変数xは、確率に関する関数を数学的な観点で見るときの引数である。単位は、たいてい収穫の個数となる。

ライブラリ

密度関数や分布関数のためのdistribとCSV出力のためのnumericalioをロードしておく。

load("distrib");
load("numericalio");

chanceの導出

chanceは、dropGainChance*1.03^gainで求められる。以下では、gainも考慮したこれをchanceと呼ぶことにする。

使用する分布関数の定義

Maximaで正規分布を積分しようとするとよく処理が終わらなくなったりするので、確率密度関数pdfの積分である累積分布関数cdfの引き算によって定積分を行う。

distribで用意されているcdf_normalは、第3引数の標準偏差が0だった時に問題がある。そこで、0だった時はxが期待値よりも大きいか小さいかで0か1を返すようにする。

cdf_normal2(x, m, s):=if s=0 then (if x-m<0 then 0 else 1) else cdf_normal(x, m, s);

chance=0であるときに標準偏差は0となる。

分布関数

IC2.random.nextGaussian() * chance * 0.6827D + chanceの分布関数を考える。

nextGaussianは平均0・標準偏差1の正規分布となる乱数と定義されているが、これで出てきた奴に対して線形変換している。

この操作による確率密度関数への影響は、平均0・標準偏差1の正規分布に対して横にchance*0.6827倍に伸ばしたあと縦にchance*0.6827分の1に押しつぶし、そしてグラフ全体を右にchanceだけ移動させたものとなる。

下図を見ると、正規分布の平均にはchance、標準偏差にはchance*0.6827が対応することが分かる。

よって、分布関数は以下のようになる。

cdf_normal3(x, chance):=cdf_normal2(x, chance, chance * 0.6827);

 

平均0・標準偏差1の正規分布(ガウス分布) 平均1・標準偏差2の正規分布(ガウス分布)
Math.roundの引数内部のものの確率密度関数。
実際の収穫量の確率密度関数は整数に丸める処理により離散値となる。
図5 左図にchanceをかけて、視覚的に分かりやすくしたもの。
x=chanceとなるようなxが、最も高い確率で引き当てられる。

あるchanceにおいて、ある収穫個数を採る確率

収穫個数は離散的であるので、連続的であるcdf_normal3を収穫個数に対応する区間ごとに積分する。

定積分するべき確率密度関数の区間は、次のようになる。

収穫個数 乱数の範囲
0 [-∞, 0.5)
1 [0.5, 1.5)
2 [1.5, 2.5)
n [n - 0.5, n + 0.5)

これを、収穫個数が0の場合と1以上の場合に分けて

N(count, chance) := cdf_normal3(count + 0.5, chance) - (if count = 0 then cdf_normal3(minf) else cdf_normal3(count - 0.5, chance));

としたいが、これだとcount=0の場合に∞を含むerfが計算できなくなるので、

N(count, chance) := cdf_normal3(count + 0.5, chance) - (if count = 0 then0 else cdf_normal3(count - 0.5, chance));

とする。

Nの値。
plot3d(N(count, chance), [count, 0, 10], [chance, 0, 10]);
各chanceにおいて、全てのcountにおけるNの和。
起こり得る全ての現象の確率を足すと1となるアレを満たす。

plot2d(sum(float(N(count, chance)), count, 0, 100), [chance, 0, 10]);
chanceに対するcropCountの期待値のグラフ。
plot2d(sum(float(N(count, chance) * count), count, 0, 100), [chance, 0, 1]);
左図のより大きな領域でのプロット。
plot2d(sum(float(N(count, chance) * count), count, 0, 100), [chance, 0, 10]);

出力

これの行列を得たいが、そのためには配列にしないといけないらしい。なので配列を定義する。

A[i, j]:=N(i-1, j-1);
A2[i, j]:=N(i-1, (j-1)/10);

行列および配列の添え字番号は1から始まるので、0以上で定義されるcountとchanceのために1を引いておく。また、chanceは連続値であるため、離散値でしか与えられない配列のためにchanceが1刻みのものと0.1刻みの物で2種類の配列を宣言しておく。

配列を行列にするには、genmatrixを使い、floatを使って式の具体的な値を出し、write_dataを使ってCSVとして出力する。

write_data(float(genmatrix(A, 41, 21)), "c:/tmp/maxima_grapf1.csv", csv);
write_data(float(genmatrix(A2, 11, 21)), "c:/tmp/maxima_grapf2.csv", csv);

maximaの行列からExcelに張り付けるにはどうやらこれくらいしかない?

まとめ

下の表を出すためのMaximaコード。

load("distrib");
load("numericalio");
cdf_normal2(x, m, s):=if s=0 then (if x-m<0 then 0 else 1) else cdf_normal(x, m, s);
cdf_normal3(x, chance):=cdf_normal2(x, chance, chance * 0.6827);

N(count, chance) := cdf_normal3(count + 0.5, chance) - (if count = 0 then 0 else cdf_normal3(count - 0.5, chance));
A[i, j]:=N(i-1, j-1);
A2[i, j]:=N(i-1, (j-1)/10);

write_data(float(genmatrix(A, 41, 21)), "c:/tmp/maxima_grapf1.csv", csv);
write_data(float(genmatrix(A2, 11, 21)), "c:/tmp/maxima_grapf2.csv", csv);

dropCountの期待値

折角期待値の綺麗な関数が書けているので、これの関数を出したい。
というわけで以下の命令により出すと、もう一つ下のようなどーん!とした代物が出てくる。この例では0から10までで止めてあるので実際にはこれは無限に続く。

kitaiti(chance, limit):=sum(N(count, chance) * count, count, 0, limit)$
ratsimp(kitaiti(chance,10));

10*cdf_normal(21/2,chance,(6827*chance)/10000)
-cdf_normal(19/2,chance,(6827*chance)/10000)
-cdf_normal(17/2,chance,(6827*chance)/10000)
-cdf_normal(15/2,chance,(6827*chance)/10000)
-cdf_normal(13/2,chance,(6827*chance)/10000)
-cdf_normal(11/2,chance,(6827*chance)/10000)
-cdf_normal(9/2,chance,(6827*chance)/10000)
-cdf_normal(7/2,chance,(6827*chance)/10000)
-cdf_normal(5/2,chance,(6827*chance)/10000)
-cdf_normal(3/2,chance,(6827*chance)/10000)
-cdf_normal(1/2,chance,(6827*chance)/10000)

漸近線

ということで、この期待値の漸近線を近似してみる。

float((kitaiti(20.01, 1000) - kitaiti(20, 1000)) * 100);

傾きは大体1.021691099852673であると分かった。次に、傾きを20倍にした奴をchance=20の期待値から引く。

float(kitaiti(20, 1000)) - 20 * 1.021691099852673;

-8.323436869588363*10^-4となり、ほぼ0なので、期待値は+∞においてchanceに比例しそうである。

chance>2における近似式

期待値からchanceの1.02169…倍を引いたもののグラフを下図に示す。

期待値からchanceの1.02169…倍を引いたもの
plot2d(kitaiti(chance, 100) - chance*1.021691099852673, [chance, 0, 10]);
左図の0~2におけるプロット。

まあ0.005個くらいの誤差ならよくね?と言うことで、chance=2以上は、以下の式で期待値を近似してよさそうである。

dropCountの期待値 = chance * 1.0217  (chance≧2)

chance→∞における考察(追記)

図5を見ると、chanceが正の無限大に発散するとき、x=0の値は何かに漸近する。この図はchanceがかけられているので、実際には、x=0となる確率密度関数の値はchanceに反比例するといえる。

このことから、前項の係数をもっと正確に求められないだろうか。


dropCountが0となる確率は、float(cdf_normal3(0.5, chance));で表され、chance→∞におけるそれはfloat(cdf_normal3(0.5, 1e100));と近似できる。

また、float(cdf_normal3(0.5, 1e100) - cdf_normal3(0, 1e100));が≒0となるので、chance→∞において、dropCountが0となる確率は、分布関数のx=0の値と等しい。その値は、約0.07149153566887989である。

これは、chanceをどんなに上げても、およそ7.15%の確率で何も出ないことを示す


正規分布の期待値は与えた平均と等しいが、今回の分布では、0以下の部分を0に切り上げている。これがどのように期待値に影響するのだろうか。

そのために、まず正規分布をとる乱数がある区間以外だった場合は0とみなしたときの期待値を考える。それには、確率密度関数にxをかけたものをその区間で積分すればよい。

kitaiti_normal(min, max, m, s):=(integrate(pdf_normal(x, m, s) * x, x, min, max));
kitaiti_normal3(min, max, chance):=kitaiti_normal(min, max, chance, 0.6827 * chance);

以下はpdf_normalの引数にそのまま定数を入れるとなんかmaximaが謎に固まるので、引数を表に出してみたバージョン。

kitaiti_normal(min, max, m, s):=(integrate(pdf_normal((x - m) / s, 0, 1) / s * x, x, min, max));

そして、chance→∞における、0から∞までの期待値をchanceで割ったものを求めると、

float(kitaiti_normal3(0, inf, 1e+5) / 1e+5);

1.021670300193958という結果が出た。5桁に丸めると、前項での値と等しくなるので、前項の値をそのまま使ってよさそうである。

chance<2における近似式

下の表によれば、chance<2ではdropCountが6個を超える場合は考慮しなくてもよさそうである。そこで、次の式を近似式とする。

6*cdf_normal(13/2,chance,(6827*chance)/10000)
-cdf_normal(11/2,chance,(6827*chance)/10000)
-cdf_normal(9/2,chance,(6827*chance)/10000)
-cdf_normal(7/2,chance,(6827*chance)/10000)
-cdf_normal(5/2,chance,(6827*chance)/10000)
-cdf_normal(3/2,chance,(6827*chance)/10000)
-cdf_normal(1/2,chance,(6827*chance)/10000)

最終的な近似式

これらを合わせると、最終的に次のようになる。

kitaiti2(chance):=if chance<2 then kitaiti(chance, 6) else chance*1.0217;

この関数のグラフを次に示す。

近似した期待値のグラフ。中央を境にして2つの関数が分かれる。
plot2d(kitaiti2(chance), [chance, 0, 4]);

まとめ

以下の式をMaximaに入力すると、kitaiti2(chance);という呼び出しでchanceごとの期待値が分かる。誤差はchance<2では±0.005未満、chance>2では±0.001倍未満のはず。

load("distrib");
cdf_normal2(x, m, s):=if s=0 then (if x-m<0 then 0 else 1) else cdf_normal(x, m, s);
cdf_normal3(x, chance):=cdf_normal2(x, chance, chance * 0.6827);

N(count, chance) := cdf_normal3(count + 0.5, chance) - (if count = 0 then 0 else cdf_normal3(count - 0.5, chance));

kitaiti(chance, limit):=sum(N(count, chance) * count, count, 0, limit);
kitaiti2(chance):=if chance<2 then kitaiti(chance, 6) else chance*1.0217;

dropCountの数値

以下にchanceごとの、各収穫量の発生確率の表を載せる。基本的に一番上の表だけ見ればよいだろう。一番上の表だけ、縦軸にchanceがきて横軸に個数が来ている点に注意

青いレコードはchance=0のグラフで、隣の赤いレコードはchance=1のグラフ。レコード内では右上に行くほど1刻みで収穫量が下がり、端は0となる。
高さはそのchanceにおいて、その収穫量となる確率を表す。
青いレコードは収穫量=0のグラフで、隣の赤いレコードは収穫量=1のグラフ。レコード内では右上に行くほど0.1刻みでchanceが下がり、端は0となる。
高さはそのchanceにおいて、その収穫量となる確率を表す。

chance=0~2、0.1刻み

見方: 先にchanceを算出し、0.6であった場合、表中の青い行に注目する。このとき、dropCountはおよそ4割で0、およそ6割で1、1.4%の確率で2、無視できる確率で3以上となる。

チャ\個 0 1 2 3 4 5 6 7
0 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.1 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.2 0.9860 0.0140 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.3 0.8356 0.1644 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.4 0.6429 0.3571 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.5 0.5000 0.4983 0.0017 0.0000 0.0000 0.0000 0.0000 0.0000
0.6 0.4036 0.5824 0.0140 0.0000 0.0000 0.0000 0.0000 0.0000
0.7 0.3378 0.6151 0.0470 0.0001 0.0000 0.0000 0.0000 0.0000
0.8 0.2914 0.6086 0.0991 0.0009 0.0000 0.0000 0.0000 0.0000
0.9 0.2575 0.5781 0.1598 0.0046 0.0000 0.0000 0.0000 0.0000
1 0.2320 0.5361 0.2180 0.0139 0.0001 0.0000 0.0000 0.0000
1.1 0.2122 0.4907 0.2660 0.0304 0.0007 0.0000 0.0000 0.0000
1.2 0.1964 0.4465 0.3008 0.0538 0.0025 0.0000 0.0000 0.0000
1.3 0.1837 0.4055 0.3227 0.0816 0.0064 0.0002 0.0000 0.0000
1.4 0.1732 0.3685 0.3334 0.1109 0.0134 0.0006 0.0000 0.0000
1.5 0.1644 0.3356 0.3356 0.1390 0.0237 0.0017 0.0000 0.0000
1.6 0.1570 0.3066 0.3315 0.1640 0.0370 0.0038 0.0002 0.0000
1.7 0.1506 0.2810 0.3231 0.1849 0.0525 0.0074 0.0005 0.0000
1.8 0.1451 0.2585 0.3120 0.2012 0.0693 0.0127 0.0012 0.0001
1.9 0.1402 0.2387 0.2993 0.2131 0.0862 0.0198 0.0026 0.0002
2 0.1360 0.2211 0.2858 0.2211 0.1024 0.0284 0.0047 0.0005

chance=0~10、1刻み

個\チャ 0 1 2 3 4 5 6 7 8 9 10
0 1.0000 0.2320 0.1360 0.1111 0.1000 0.0937 0.0897 0.0869 0.0848 0.0833 0.0820
1 0.0000 0.5361 0.2211 0.1209 0.0800 0.0589 0.0463 0.0380 0.0322 0.0278 0.0245
2 0.0000 0.2180 0.2858 0.1716 0.1114 0.0794 0.0605 0.0483 0.0400 0.0339 0.0294
3 0.0000 0.0139 0.2211 0.1929 0.1360 0.0982 0.0744 0.0588 0.0480 0.0403 0.0345
4 0.0000 0.0001 0.1024 0.1716 0.1453 0.1116 0.0863 0.0685 0.0558 0.0466 0.0397
5 0.0000 0.0000 0.0284 0.1209 0.1360 0.1165 0.0943 0.0764 0.0628 0.0525 0.0447
6 0.0000 0.0000 0.0047 0.0674 0.1114 0.1116 0.0972 0.0815 0.0682 0.0576 0.0492
7 0.0000 0.0000 0.0005 0.0297 0.0800 0.0982 0.0943 0.0833 0.0717 0.0615 0.0530
8 0.0000 0.0000 0.0000 0.0104 0.0503 0.0794 0.0863 0.0815 0.0729 0.0640 0.0559
9 0.0000 0.0000 0.0000 0.0029 0.0277 0.0589 0.0744 0.0764 0.0717 0.0649 0.0578
10 0.0000 0.0000 0.0000 0.0006 0.0134 0.0401 0.0605 0.0685 0.0682 0.0640 0.0584
11 0.0000 0.0000 0.0000 0.0001 0.0056 0.0251 0.0463 0.0588 0.0628 0.0615 0.0578
12 0.0000 0.0000 0.0000 0.0000 0.0021 0.0144 0.0334 0.0483 0.0558 0.0576 0.0559
13 0.0000 0.0000 0.0000 0.0000 0.0007 0.0076 0.0227 0.0380 0.0480 0.0525 0.0530
14 0.0000 0.0000 0.0000 0.0000 0.0002 0.0037 0.0146 0.0286 0.0400 0.0466 0.0492
15 0.0000 0.0000 0.0000 0.0000 0.0000 0.0016 0.0088 0.0206 0.0322 0.0403 0.0447
16 0.0000 0.0000 0.0000 0.0000 0.0000 0.0007 0.0050 0.0142 0.0250 0.0339 0.0397
17 0.0000 0.0000 0.0000 0.0000 0.0000 0.0003 0.0027 0.0094 0.0188 0.0278 0.0345
18 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0014 0.0059 0.0137 0.0222 0.0294
19 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0006 0.0036 0.0097 0.0173 0.0245
20 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0003 0.0021 0.0066 0.0131 0.0200
21 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0012 0.0043 0.0097 0.0160
22 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0006 0.0028 0.0070 0.0125
23 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0003 0.0017 0.0049 0.0096
24 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0010 0.0033 0.0072
25 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0006 0.0022 0.0052
26 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0003 0.0014 0.0038
27 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0009 0.0026
28 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0005 0.0018
29 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0003 0.0012
30 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0008
31 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0005
32 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0003
33 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002
34 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001
35 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001
36 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000

chance=10~20、1刻み

個\チャ 11 12 13 14 15 16 17 18 19 20
0 0.0810 0.0802 0.0795 0.0789 0.0784 0.0779 0.0776 0.0772 0.0769 0.0766
1 0.0219 0.0198 0.0180 0.0166 0.0153 0.0142 0.0133 0.0125 0.0117 0.0111
2 0.0259 0.0231 0.0209 0.0190 0.0174 0.0161 0.0149 0.0139 0.0130 0.0123
3 0.0301 0.0266 0.0238 0.0215 0.0196 0.0180 0.0166 0.0154 0.0144 0.0135
4 0.0344 0.0302 0.0269 0.0241 0.0219 0.0200 0.0184 0.0170 0.0158 0.0147
5 0.0386 0.0338 0.0299 0.0268 0.0242 0.0220 0.0201 0.0186 0.0172 0.0160
6 0.0425 0.0372 0.0329 0.0294 0.0265 0.0240 0.0219 0.0202 0.0186 0.0173
7 0.0461 0.0404 0.0358 0.0319 0.0287 0.0260 0.0237 0.0217 0.0200 0.0186
8 0.0490 0.0432 0.0383 0.0343 0.0308 0.0279 0.0254 0.0233 0.0215 0.0199
9 0.0512 0.0455 0.0406 0.0364 0.0328 0.0297 0.0271 0.0248 0.0228 0.0211
10 0.0526 0.0472 0.0424 0.0382 0.0346 0.0314 0.0287 0.0263 0.0242 0.0223
11 0.0531 0.0483 0.0438 0.0397 0.0361 0.0329 0.0301 0.0276 0.0254 0.0235
12 0.0526 0.0487 0.0446 0.0408 0.0373 0.0341 0.0313 0.0288 0.0266 0.0246
13 0.0512 0.0483 0.0449 0.0415 0.0382 0.0352 0.0324 0.0299 0.0276 0.0256
14 0.0490 0.0472 0.0446 0.0417 0.0388 0.0359 0.0332 0.0308 0.0285 0.0265
15 0.0461 0.0455 0.0438 0.0415 0.0389 0.0364 0.0339 0.0315 0.0293 0.0273
16 0.0425 0.0432 0.0424 0.0408 0.0388 0.0365 0.0342 0.0320 0.0299 0.0280
17 0.0386 0.0404 0.0406 0.0397 0.0382 0.0364 0.0344 0.0323 0.0304 0.0285
18 0.0344 0.0372 0.0383 0.0382 0.0373 0.0359 0.0342 0.0325 0.0307 0.0289
19 0.0301 0.0338 0.0358 0.0364 0.0361 0.0352 0.0339 0.0323 0.0307 0.0291
20 0.0259 0.0302 0.0329 0.0343 0.0346 0.0341 0.0332 0.0320 0.0307 0.0292
21 0.0219 0.0266 0.0299 0.0319 0.0328 0.0329 0.0324 0.0315 0.0304 0.0291
22 0.0182 0.0231 0.0269 0.0294 0.0308 0.0314 0.0313 0.0308 0.0299 0.0289
23 0.0148 0.0198 0.0238 0.0268 0.0287 0.0297 0.0301 0.0299 0.0293 0.0285
24 0.0119 0.0167 0.0209 0.0241 0.0265 0.0279 0.0287 0.0288 0.0285 0.0280
25 0.0094 0.0138 0.0180 0.0215 0.0242 0.0260 0.0271 0.0276 0.0276 0.0273
26 0.0072 0.0113 0.0154 0.0190 0.0219 0.0240 0.0254 0.0263 0.0266 0.0265
27 0.0055 0.0091 0.0130 0.0166 0.0196 0.0220 0.0237 0.0248 0.0254 0.0256
28 0.0041 0.0072 0.0108 0.0143 0.0174 0.0200 0.0219 0.0233 0.0242 0.0246
29 0.0030 0.0057 0.0089 0.0122 0.0153 0.0180 0.0201 0.0217 0.0228 0.0235
30 0.0022 0.0044 0.0072 0.0103 0.0133 0.0161 0.0184 0.0202 0.0215 0.0223
31 0.0015 0.0033 0.0058 0.0086 0.0115 0.0142 0.0166 0.0186 0.0200 0.0211
32 0.0011 0.0025 0.0046 0.0071 0.0098 0.0125 0.0149 0.0170 0.0186 0.0199
33 0.0007 0.0018 0.0036 0.0058 0.0083 0.0109 0.0133 0.0154 0.0172 0.0186
34 0.0005 0.0013 0.0027 0.0047 0.0070 0.0094 0.0118 0.0139 0.0158 0.0173
35 0.0003 0.0010 0.0021 0.0037 0.0058 0.0081 0.0103 0.0125 0.0144 0.0160
36 0.0002 0.0007 0.0016 0.0030 0.0048 0.0068 0.0090 0.0111 0.0130 0.0147
37 0.0001 0.0005 0.0012 0.0023 0.0039 0.0058 0.0078 0.0098 0.0117 0.0135
38 0.0001 0.0003 0.0009 0.0018 0.0031 0.0048 0.0067 0.0086 0.0105 0.0123
39 0.0001 0.0002 0.0006 0.0014 0.0025 0.0040 0.0057 0.0075 0.0094 0.0111
40 0.0000 0.0001 0.0004 0.0010 0.0020 0.0033 0.0048 0.0065 0.0083 0.0100

Gain補正

dropCountまで計算し、これが個数かと思ったら大間違いである。最後の刺客、Gain補正がある。

dropCountはスタックされたアイテムを表すItemStackの個数であり、各ItemStackのスタックの合計ではない。よって、スタックされた状態のアイテムが植物種から提供されれば、実際の収穫量はdropCountのそれ倍になる

しかし、実際にはここにGain補正が加わりそれよりも個数が増える。Gain補正は、各ItemStackのスタックサイズを、(Gain+1)/100の確率で1個上昇させるというものである。

これらを考慮すると、最終的に得られる収穫物の量は次式で表される。

収穫物の量 = dropCount * (各ItemStackのスタックサイズ + (Gain + 1) / 100)

まとめ

以下のコードをMaximaに入力すると、一番下の行により右クリックしたときに出る収穫物のアイテムの量の期待値が出る。上側4つは、自由に変更してよい。

tier: 5;
dropGainChance: 0.95^tier;
gain: 31;
stackSize: 1;

load("distrib");

cdf_normal2(x, m, s):=if s=0 then (if x-m<0 then 0 else 1) else cdf_normal(x, m, s);
cdf_normal3(x, chance):=cdf_normal2(x, chance, chance * 0.6827);

N(count, chance) := cdf_normal3(count + 0.5, chance) - (if count = 0 then 0 else cdf_normal3(count - 0.5, chance));

kitaiti(chance, limit):=sum(N(count, chance) * count, count, 0, limit);

kitaiti2(chance):=if chance<2 then kitaiti(chance, 6) else chance*1.0217;

float(kitaiti2(dropGainChance * 1.03^gain) * (stackSize + (gain + 1)/100));

dropGainChanceをオーバーライドしていない植物種の収穫量の表を載せる。

Tier Gain StackSize 期待値
12 0 1 0.5536848034091179
12 31 1 1.814122778769537
8 0 1 0.680006781725364
8 31 1 2.230275899915201
4 0 1 0.8324585874431774
4 31 1 2.746285675212498
1 0 1 0.9724170486670886
1 31 1 3.203132439378916

 

最終更新:2015年06月07日 15:52