目標
手順1 ステータス成長値の仕組みを知る
手順2 乱数を考える
- 乱数100まんこのぶんぷさくせい
- 箱ひげ図の見方
手順3 乱数とステータス数式を組み合わせ
次の展開
目標:タフガイ戦士♂の体力をどらくえ3の乱数生成モデルをつかって成長させてみる
まずはこのページを見る
きほんはまる『 SFC版DQ3 ステータス成長について』
http://ch.nicovideo.jp/maru0137/blomaga/ar530979
まとめると
どらくえ3のステータスは 職業基本成長値 × 乱数 × 性格補正 で決まるらしい
基本成長値および性格補正値はネット上に載っているので特に触れない。適当に調べるといいよ。
今回は乱数生成をきちんと行い、成長をゲームに近い形で仮想的に試行できるかが目的となる。
なおこのブロマガの続きは更新されていない。 いつ定量的に迫るのか待ちどうしいね!
行動順を決める乱数とステータス成長に使われる乱数はどうやら同じ方法で作成されるらしい。 内部で0~31までの値の出るサイコロを16回振ってその合計値をいじくってなんやかんやするようだ。
とりあえずサイコロ
この式をR上で再現するとこのようになる
Nave = function(n){
(136+sum( sample(0:31,n,replace=T)) )%%256
## (サイコロ16個の和)+136 を 256で割った余りを算出
}
Nave = function(n){
(136+sum( sample(0:31,n,replace=T)) )%%256
## (サイコロ16個の和)+136 を 256で割った余りを算出
}
dice = sapply(rep(16,1000000),Nave) #100万作ってみる
hist(dice + 0.01, breaks = 256, probability = T,
col = "gray",
main = "図1:DQ3の乱数シミュレート結果",
xlab = "index")
分布はきれいな山形になる。
つぎ乱数の分布を箱ひげ図を用いて一様分布と比較してみる。
箱の部分(枠で囲まれた部分)にチョイスした100万の値のうち50%が収まっている
箱部分の上下にある水平線は平均±2標準偏差の値。このふたつの線の間に全体の95%が収まっている
boxplot(dice,x,
main= "分布の偏りの比較",
names = c("どらくえ3の乱数分布","普通のサイコロ乱数(一様分布)"),
col = "lightyellow"
)
どちらも平均128だがDQ3の乱数は25以下や230以上がでにくいようになってる。
ちなみにこのふたつの分布の統計量は
c(summary(x),sd(x))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 63.00 127.00 127.00 191.00 255.00 73.91
c(summary(dice),sd(dice))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 103.00 128.00 128.00 153.00 255.00 36.88
となり、
一様分布は 平均127.5 偏差約74
どらくえ3の乱数分布は 平均128 偏差約37
だそうです
乱数はできたので戦士の成長シミュレートできるようにコードを書いてみる。
## 戦士のレベル22までの基本成長値 レベル9から成長ピーク期に入る
Ts =c(2,2,2,2,2,2,2,
5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5,5.5)
DQ_Ts = function(a){ ## a は体力初期値
Ts_dice = sapply(rep(16,21),Nave)
Ts1 = (Ts*Ts_dice/128)
Ts.sim =Ts1*179/128 ## 179はタフガイの性格補正値
cumsum(c(a,Ts.sim)) ## 22レベまでそれぞれの体力値を並べる
}
これで関数入力したら22レベルまで各レベルの体力値をシミュレートできる
#体力初期値20 のタフガイ戦士の体力シュミレート
print(DQ_Ts(20))
## [1] 20.00 23.54 26.93 30.09 34.16 35.78 38.18 40.98 48.31 55.64
## [11] 62.61 71.86 80.33 89.77 97.40 102.81 110.38 117.59 122.04 131.83
## [21] 140.90 150.40
複数のシミュレートを一気にすることもできる
例 タフガイ戦士を5人つくってみる
#体力初期値20 のタフガイ戦士の体力シュミレート を5人分やる
Nave1 = sapply(rep(20,5),DQ_Ts)
print(Nave1)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 20.00 20.00 20.00 20.00 20.00
## [2,] 23.54 23.02 24.28 23.61 23.28
## [3,] 26.75 24.06 27.17 27.08 25.77
## [4,] 27.39 26.86 29.13 28.33 29.48
## [5,] 30.16 29.83 33.04 30.95 32.63
## [6,] 33.53 32.54 36.02 35.27 35.67
## [7,] 37.52 34.40 38.11 37.72 37.74
## [8,] 39.82 37.70 41.41 38.79 40.04
## [9,] 48.11 45.63 51.21 43.30 48.57
## [10,] 55.56 48.76 57.34 50.33 53.44
## [11,] 64.76 56.39 62.81 58.38 62.69
## [12,] 71.31 65.10 74.22 67.57 69.72
## [13,] 74.55 75.01 81.13 78.03 75.07
## [14,] 80.44 84.45 91.11 84.34 85.28
## [15,] 89.63 89.26 96.82 89.69 90.93
## [16,] 99.13 98.51 104.63 100.14 99.16
## [17,] 107.30 110.65 110.22 104.95 108.90
## [18,] 118.96 117.38 120.79 110.36 114.67
## [19,] 129.41 127.53 131.37 117.27 124.40
## [20,] 135.84 134.26 138.16 125.14 130.53
## [21,] 141.55 140.87 149.27 131.21 140.09
## [22,] 145.33 147.24 158.17 134.51 147.00
さっきのは横にならべてあったけど今回の場合は縦に見る
一番上が1レベル 一番下が22レベル
今日はここまで
乱数とステ関係はできたので次は性格(タフガイor鉄人)・レベルなどの比較をし、図示できたらいいね!
気が向いたらやる -> 多分やらない