見出し画像

フェアリーミラクル成功率


はじめに

獅子王やったならミラクルもでしょと思ったので計算してみました。

ただこちらは獅子王のようには簡単にいかなくて,引いたカードで5つの文明が揃っているのかまで参照しなければなりません。

だいたい1行5列のデータフレームに引いたカードの色を画分していくことになるんだろうなと思ってましたが,今回は無事それで計算できました。

当然使用する構築によって色配分が異なるので,今回はより具体的に構築を決定する必要が生じます。5色コントロール界隈は個性派が多い印象なのでどの構築にするのか悩みましたが,今回はGP6thで優勝されたどてらさんの構築を用いることにしました(もし不快に思われたら教えてください。変更します)。


これまでベールに包まれていたフェアリーミラクルの成功確率を具体的な数値計算で求めたという点では,まあまあ新しいと思っています。


計算の考え方

求めるのは先攻3t目にフェアリーミラクルで2ブーストできる確率です。これを求める上で,大きく分けて3つの問題があると思いました。

①3t目に引いたカードの扱い

②3t目にミラクルをキャスト出来るか

③5つの文明が揃っているか

です。順を追って説明します。


①3t目に引いたカードの扱い

この計算を行うときに特に気をつけなければならない部分は,3t目に引いたカード(便宜的にカードAとします)が多色であれば,それを文明としてカウントすることは出来ないということです。

少し考えると当たり前ですが,そのタイミングで引いた多色はマナに置けないためです。

その一方で,Aが単色であった場合は当然マナ置き出来ますから文明をカウントすることが出来ます。

これについては条件分岐でなんとか出来ました。


②3t目にミラクルをキャスト出来るか

これは獅子王のときコードに取り入れていた単色と多色の問題です。つまり,多色しか引いていなければ仮に1枚だけフェアリーミラクルを引いていたとしてもアンタップインでマナ置き出来るカードが無いため,3t目のミラクルキャストが不可能となります。

そのため,3t目のミラクルキャストのためにはミラクルの他にも単色のカードが1枚以上必要となります。それを考慮に入れた上で,文明を踏まえた計算を行っていきます。


③5つの文明が揃っているか

これに関しては冒頭で述べた通り,1行5列のデータフレームを作成します。各列に対して5つの文明を割り当て,引いたカードやミラクルでマナに置いたカードに含まれる文明を各列ごとに足し合わせていきます(詳しくはコードをご覧ください)。

ミラクルで1枚目をマナに置いた段階で,このデータフレームの各要素の数値を掛け合わせた値が1以上(すなわちいずれも0では無かった)場合に成功としてカウントします。


それでは計算に入ります。


計算の詳細

以下にコードと計算の結果を示します。

このコードを応用すると,どんな構築であっても,ミラクルが成功する確率を容易に求めることが可能になります。

#### フェアリーミラクル
##先行3t目に引いたカードAが単色なら文明カウント,多色なら文明非カウント
# n:試行回数
res<-function(n){
	
result<-0
for(i in 1:n){
 #火 ,自然,水,闇,光
e1 <- c(0,1,0,0,0)  #ミラクル 
e2 <- c(0,1,0,0,0)  #ミラクル 
e3 <- c(0,1,0,0,0)  #ミラクル 
e4 <- c(0,1,0,0,0)  #ミラクル 
e5 <- c(0,1,0,0,0)
e6 <- c(0,1,0,0,0)
e7 <- c(0,1,0,0,0)
e8 <- c(0,1,0,0,0)
e9 <- c(0,0,1,0,0)
e10 <- c(0,0,1,0,0)
e11 <- c(0,0,1,0,0)
e12 <- c(0,0,1,0,0)
e13 <- c(0,0,1,0,0)
e14 <- c(0,0,1,0,0)
e15 <- c(0,1,0,0,0)
e16 <- c(0,1,0,0,0)
e17 <- c(0,0,0,0,1)
e18 <- c(1,0,0,0,0)
e19 <- c(0,0,1,1,0) #多色 
e20 <- c(0,0,1,1,0) #
e21 <- c(0,1,0,0,1) #
e22 <- c(1,1,0,0,1) #
e23 <- c(1,1,0,0,1) #
e24 <- c(0,0,1,1,0) #
e25 <- c(0,1,1,0,1) #
e26 <- c(0,1,1,0,1) #
e27 <- c(0,0,1,1,0) #
e28 <- c(0,0,1,1,0) #
e29 <- c(0,0,1,0,1) #
e30 <- c(0,0,1,0,1) #
e31 <- c(1,1,0,0,0) #
e32 <- c(1,1,0,0,0) #
e33 <- c(1,0,1,1,0) #
e34 <- c(1,0,1,1,0) #
e35 <- c(1,1,0,0,0) #
e36 <- c(0,1,0,0,1) #
e37 <- c(0,1,0,0,1) #
e38 <- c(1,1,0,1,0) #
e39 <- c(1,1,0,1,0) #
e40 <- c(1,1,0,1,0) #

deck <- t(matrix(c(e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40),5,40))


t.deck <- c(1:40)

num1 <- c(sample(t.deck,1))
hand1 <- deck[num1,]

t.deck[num1] <- NA
t.deck <- na.omit(t.deck)

num2 <- c(sample(t.deck,1))
hand2 <- deck[num2,]
t.deck[num2] <- NA
t.deck <- na.omit(t.deck)

num3 <- c(sample(t.deck,1))
hand3 <- deck[num3,]
t.deck[num3] <- NA
t.deck <- na.omit(t.deck)

num4 <- c(sample(t.deck,1))
hand4 <- deck[num4,]
t.deck[num4] <- NA
t.deck <- na.omit(t.deck)

num5 <- c(sample(t.deck,1))
hand5 <- deck[num5,]
t.deck[num5] <- NA
t.deck <- na.omit(t.deck)

num6 <- c(sample(t.deck,1))
hand6 <- deck[num6,]
t.deck[num6] <- NA
t.deck <- na.omit(t.deck)

num7 <- c(sample(t.deck,1))
hand7 <- deck[num7,]
t.deck[num7] <- NA
t.deck <- na.omit(t.deck)

if(num7>=1&num7<=18){
	hands <- hand1+hand2+hand3+hand4+hand5+hand6+hand7
	nums <- c(num1,num2,num3,num4,num5,num6,num7)
	length(nums[nums>=1&nums<=4])

	if( length(nums[nums>=1&nums<=4])>=1&& length(nums[nums>=1&nums<=18])>=2){
	
		topnum <- sample(t.deck,1)
		top <- deck[topnum,]
		deck[num7] <- NA
		deck <- na.omit(deck)
	
		col <- hand1+hand2+hand3+hand4+hand5+hand6+hand7+top
		
	
		if(col[1]*col[2]*col[3]*col[4]*col[5]>=1){
		result <- result +1	
	}
	}
}else{


	hands <- hand1+hand2+hand3+hand4+hand5+hand6
	nums <- c(num1,num2,num3,num4,num5,num6)
	length(nums[nums>=1&nums<=4])

	if( length(nums[nums>=1&nums<=4])>=1&& length(nums[nums>=1&nums<=18])>=2){
	
		topnum <- sample(t.deck,1)
		top <- deck[topnum,]
		deck[num7] <- NA
		deck <- na.omit(deck)
	
		col <- hand1+hand2+hand3+hand4+hand5+hand6+top
		
		if(col[1]*col[2]*col[3]*col[4]*col[5]>=1){
			result <- result +1
	}
}
}
}
return(result/n)
}

res(1000000)

[1] 0.338257


まとめ

以上より,先攻3t目にフェアリーミラクルが成功して2ブースト出来る確率は33.8%らしいと分かりました。意外と高い…。

計算して欲しい構築なんかがあれば
Twitterの@beer_mug_bにメンションください

もっと良いコードをご存知の方いましたらぜひ教えてください。




#デュエル・マスターズ

この記事が参加している募集

はじめてのインターネット

この記事が気に入ったらサポートをしてみませんか?