対空計算シミュレーション用Rubyスクリプト

前の記事で書いた敵艦載機撃墜のプロセスをRubyで書いてみたもの。

10000回ほど計算してその結果を置物化成功率、制空、割合対空など各プロセスでの撃墜数、最後に残った艦載機数を表示。

興味を持っていただけたなら、####以下の部分をテキストファイルに貼り付けて、Rubyのパスの通った場所から>Ruby.exe anti-air.rb などとして実行してみてください。


rubyのインストール方法

#####以下、プログラムのコード
plane=36 #1スロットあたりの搭載数
trial=10000 #試行回数
seiku_r=5 #制空状態指定 0:空母なし,1:喪失, 2:劣勢, 3:拮抗, 4:優勢, 5:確保
taip=20 #割合撃墜率(%)
taic=8 #固定撃墜数
h_taip=45 #高い対空値の装備をしたものの割合撃墜率
h_taic=18 #高い対空値の装備をしたものの固定撃墜数
high_mem=1 #制空を意識して装備したメンバー数。h_taip,h_taicが適用される
full_mem=6 #艦数 通常6、連合艦隊なら12
aacut_ship=2 #対空カットイン持ち艦数
aacut_num=7 #対空カットイン撃墜数

chk=0
success=0
slot_s=0
seiku_a=[0,20,40,60,80,90]
geki=[0,0,0,0]
attack=[0,0,0]
ap=[0,0,0]
hl=[0,0,0]
rand=Random.new

while trial>chk
slot=[plane,plane,plane]
seiku=rand(seiku_a[seiku_r]+1)
(0..2).each{|i| slot[i] -=(seiku/100.0*plane).to_i}
geki[0]+=3*(seiku/100.0*plane).to_i

#対空割合撃墜
(0..2).each{|i| ap[i] = rand(2)}
(0..2).each{|i| hl[i] = rand(full_mem)}
(0..2).each{|i|
if ap[i]!=0
if hl[i]>=full_mem-high_mem
tmp= (h_taip/100.0*slot[i]).to_i
slot[i] -=tmp
geki[1]+=tmp
else
tmp= (taip/100.0*slot[i]).to_i
slot[i] -=tmp
geki[1]+=tmp
end
end
}


#対空固定撃墜
(0..2).each{|i| ap[i] = rand(2)}
(0..2).each{|i| hl[i] = rand(full_mem)}
(0..2).each{|i|
if ap[i]!=0
if hl[i]>=full_mem-high_mem
slot[i] -=h_taic
geki[2]+=h_taic
else
slot[i] -=taic
geki[2]+=taic
end
end
}
aacut=rand(2**aacut_ship) #対空カットイン
if aacut !=0
(0..2).each{|i| slot[i]-=aacut_num}
geki[3]+=aacut_num * 3
end

(0..2).each{|i| slot[i]-=1} #最低保証1機撃墜

if slot[0]<=0 && slot[1]<=0 && slot[2]<=0
success+=1 #スロットゼロ判定
end
(0..2).each{|i|if slot[i]<=0
slot[i]=0 #撃墜数計算用 マイナスをゼロに書き換え
slot_s+=1
end
}
(0..2).each{|i| attack[i]+=slot[i]} #残機加算
chk += 1
end
succ_p=100.0*success/trial
puts "trials #{trial}, success #{success}, rate #{succ_p.round(1)}%"
puts "zero slots #{slot_s}, rate #{ (100.0/3*slot_s/trial).round(1)}%"

puts "fighter:#{geki[0]}, #{100*geki[0]/(3*plane*trial)}%, aa_p:#{geki[1]}, #{100*geki[1]/(3*plane*trial)}%"
puts "aa_const:#{geki[2]}, #{100*geki[2]/(3*plane*trial)}%, aa_cut:#{geki[3]}, #{100*geki[3]/(3*plane*trial)}%"

(0..2).each{|i| attack[i]=attack[i]/trial}
puts "avg.remain slot1 : #{attack[0]}/#{plane}, slot2 : #{attack[1]}/#{plane}, slot3 : #{attack[2]}/#{plane}"

#####ここまで、プログラムのコード

インデントが無視されてる!orz
ちゃんと動くとは思うけど、もっといい上げ方はなかったものか。