月を眺める孤島

多分デレステとポケモンの話がメインのブログです

6th1日目を終えた姫川友紀Pの感想

こんばんは。姫川友紀と依田芳乃を担当しているむぅんといいます。

語彙力が大変低くなっていますが、先程西武ドームを離脱しホテルに到着したので簡単ではありますが今日のことを思い出しながら感想を書いていきたいと思います。





僕がシンデレラガールズに出会ったのは一昨年の2月です。その頃はまだライブに興味はなく、4thも「中の人の顔も名前もよく分からないし、こんな自分が行くくらいなら本気で行きたい人が行くべきだ」と思い行くことはありませんでした。
しかし、4thを終えたPの感想を見ているうちにライブに興味が沸き始め、結果として5thに行く決断をしたのが去年のことです。
それでも、当時はあまりライブにお金をかけたくなく、全国ツアーだったのもあり大阪と福岡、SSAにしか応募しなかったため担当を現地で見ることはありませんでした(福岡やSSA1日目は普通に外した上一般販売のことも知らないという今では考えられないことをしていました)。

そして今回の6thでようやく担当を現地で見る機会に恵まれました。アソビストア先行で唯一友紀が出る今日の公演だけ当たらなかったのですがSS3A2日目との交換で連れて行って頂くことができたのです。




正直、僕としてはDear My Dreamersを聴くことができればそれで十分と思っていたのですが、待ち受けていたのはあまりにすごいものでした(ごめんなさい、語彙力を失いすぎてて上手く表現できないです)。

公演後、最初に始まったのはまさかの始球式でした。そこにいたのは「野球が好きなアイドルを演じている声優さん」ではなく、「野球のことが好きな姫川友紀」と「野球のことが好きな杜野まこさん」でした。
これは友紀でなければ絶対にできなかったことです。他のアイドルではなく、姫川友紀だからこそできたことです。
勿論ドームでなければ見ることはできなかったですし、まこさんだったからこそあのような演出ができたんだと思います。



そして、その後に流れた「気持ちいいよね一等賞!」。

正直、Dear My Dreamersが発表されたとき、嬉しさの影で少しもやもやした気持ちもありました。
それは一等賞を現地で一度も聴くことがないままソロ2曲目が来てしまったという後悔から来たものです。最近のライブは完全に2曲目を中心に構成されていますし、1曲目が出たばかり、もしくは何度も2曲目を披露したアイドルでなければ最初のソロ曲を披露することはないものと思っていました。

それがまさか、こんなことになるとは。
友紀が出演するのが今日しかない以上、Dear My Dreamersも披露するのは明らかでした。1日にソロ曲を2曲披露する。こんなことがあるなんて、ライブが始まる前の自分は思ってもいませんでしたし、日本中の友紀Pが同じだったことでしょう。



ただ1つだけ心残りだったのが、披露されないだろうと思い一等賞のコールを完璧にしてこなかったことです。
フルは何度も聴いていましたが、それどころかデレステでフル以上に聴いた1番のコールすらままなりませんでした。

もし、もし次があるなら次こそは完璧にコールをしたいです。

今回は記憶をかなり失っており、申し訳ないことにDear My Dreamersの間奏でまこさんが何を喋っていたかすらあまり覚えていないほどです。
なので、曲の感想は他の人に任せたいと思います。
きっと僕よりずっと素敵な感想を書いてくれるでしょう。





姫川友紀Pとして、今日現地でライブを観ることができたのは一生の思い出です。本当に、本当にありがとうございました。

Pythonでデレステのガシャのスクショからアイドルの名前を読み取ろうと頑張った

こんばんは、むぅんです。
僕はこれまで引いたガシャの記録を全て取っており、定期的にExcelにデータを入力しては眺めて楽しんでいたのですが最近サボりまくったせいでスクショが溜まりに溜まってえらいことになってしまいました。
特におはガシャはその場ですぐに記録すればいいものをあろうことか毎日スクショで済ませてしまったが故に、今からこれを手動で打ち込むのはExcelの入力補完を使っても流石にしんどいものがあります。

そこで、Pythonで画像を頑張って加工して文字を自動で読み取れるようにしたら楽なんじゃね?という結論に至ったのでプログラムを組んでみました。
今回は、TesseractというGoogleによって開発されているOCR光学文字認識)エンジンを用いて画像から名前を出力するのを目標とします。画像の加工は皆大好きOpenCVです。
なお、Pythonバージョンは3.6です。

f:id:shinemoon227:20181017204950p:plain


これから、このひたすらコンビニと家を往復し天井をオーバーした末に拝むことができたスクショから「姫川友紀」という文字列を出力していくまでの流れを見ていきます。

f:id:shinemoon227:20181017195249p:plain



from PIL import Image
import sys
import cv2
import numpy as np
import math
import pyocr
import pyocr.builders

まずは必要なものをimportしていきます。OpenCV以外にもTesseractを動かすためのpyocrが必要となるのでそちらも合わせてインストールしておきます(日本語を読むことになるので、Tesseractは日本語のライブラリも導入しておく必要があります)。pip installで簡単に導入できるので詳細は各自で調べてください。
また、行列の計算を行うのでnumpyも必要です。

def contrast(image, a):
	lut = [np.uint8(255.0 / (1 + math.exp(-a * (i - 128.) / 255.))) for i in range(256)] 
	result_image = np.array([lut[value] for value in image.flat], dtype=np.uint8)
	result_image = result_image.reshape(image.shape)
	return result_image

OpenCVにはコントラストを調整するための関数がないようなのでここで作っておきます。こちらのコードをお借りしました。

path_input = 'IMG_0181.png'
path_output = 'IMG_0181_P.png'

画像のパスをここで指定します。inputは読み込むスクショ、outputは加工した後の画像の保存先です。間違って既に存在する画像のパスをoutputに指定してしまうと容赦なく上書きされてしまうので気をつけてください。


ss = cv2.imread(path_input, 0)
size = tuple([ss.shape[1], ss.shape[0]])
center = tuple([int(size[0]/2), int(size[1]/2)])

f:id:shinemoon227:20181017195355p:plain

画像を読み込みます。ここで、cv2.imreadの第2引数に0を指定することでグレースケールで画像を読み込むことができます。画像を加工するにあたって、このようにグレースケールで読み込むと後から大変都合が良いので忘れずに指定しておきましょう。

angle = -6
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
img_rot = cv2.warpAffine(ss, rotation_matrix, size, flags=cv2.INTER_CUBIC)

f:id:shinemoon227:20181017195534p:plain

続いて画像を6°だけ時計回りに回転させます。cv2.getRotationMatrix2Dで回転行列を作成でき、アフィン変換を容易に行うことができます。

pos = [[902, 1178], [1942, 1316]] # 切り取る矩形の左上と右下のx座標とy座標の組
img_cut = img_rot[pos[0][1]:pos[1][1], pos[0][0]:pos[1][0]]

f:id:shinemoon227:20181017195757p:plain

ここではスクショから名前の部分だけを切り取る作業を行います。左上の座標を \((x_1, y_1)\) 、右下の座標を \((x_2, y_2)\) とすると、リストposは \([[x_1, y_1], [x_2, y_2]]\) となります。勿論この通りである必要はないので各自分かりやすいように書き換えてもらっても大丈夫です。
なお、このまま実行するとiPadで撮影した画像に対応した箇所が切り取られるので、各自の機種の座標を自分で調べて入力しておきます。ここでの座標は回転後の座標になるので、アフィン変換を行った直後に一度cv2.imwriteで画像を書き出してみて、その画像を元に座標を調べておくのが良いかもしれません。
ちなみに、横にかなり長く切り取っているのはイヴちゃんのためです。ただし、残念ながらTesseractではロダンNTLGで書かれた「ン」を認識できないらしく、「イヴ・サ〕タクロ一ス」となってしまいます…。

con = 10
img_con = contrast(img_cut, con)

f:id:shinemoon227:20181017195819p:plain

ここから画像の加工に入っていきます。まずは先程定義した関数を用いてコントラストを調整します。パラメータは自分で何度も試行錯誤を行った結果10に落ち着きましたが、よりよい値を見つけた方はコメントで教えてください。

gamma = 0.1
imax = img_con.max()
img_gam = imax * (img_con / imax)**(1/gamma)

f:id:shinemoon227:20181017195834p:plain

続いてガンマ補正を加えます。この段階で既に文字だけ非常にくっきり表示できていることが分かります。CuとCoはここまで行ったコントラストの調整とガンマ補正だけで既に文字を読み取ることが可能です(con=50、gamma=0.01で動作確認済)が、Paは文字が薄く同じように調整すると上半分が欠けて読み取れなくなるのでここから更に調整を加えていきます。CuとCoの画像だと無駄な処理となってしまいますが、今回は属性による場合分けは考えないことにします。

thresh = 80
max_pixel = 255
ret, img_dst = cv2.threshold(img_gam, thresh, max_pixel, cv2.THRESH_BINARY_INV)

f:id:shinemoon227:20181017195847p:plain

ここで画像を2値化します。その際、後に行う処理のために白黒を反転しておきます。cv2.thresholdでcv2.THRESH_BINARY_INVを指定するとネガポジ反転した状態で2値化してくれます。この指定方法を知る前は普通に2値化したあとcv2.bitwise_notで反転しようと考えていたのですが、この関数で2値化したときRGB値がちょうど255と0でなくわずかにずれた値となり、NOTをかけると負数とnanになる(→画像が真っ黒になる。もう一度NOTをかけると復元は可)という不可解な現象が起きたため断念しました。2値化直後に一度png画像として出力してしまえば恐らくこの問題は解決できますが、それよりは引数で指定するほうがわかりやすく処理も高速なのでこちらの方法をオススメします。

m = 3
move_matrix = np.float32([[1, 0, m],[0, 1, m]])
size2 = tuple([img_dst.shape[1], img_dst.shape[0]])
img_mov = cv2.warpAffine(img_dst, move_matrix, size2, flags=cv2.INTER_CUBIC)

f:id:shinemoon227:20181017195902p:plain

ここまで加工した画像を複製し、3pxだけ右下にずらしたものを用意します。2×3の行列を用意して平行移動を行います。

img_and = cv2.bitwise_and(img_dst, img_mov)
cv2.imwrite(path_output, img_and)

f:id:shinemoon227:20181017195931p:plain

最後にずらす前とずらした後の画像のANDをとります。すると、元々文字の影だった部分が見事に消えてなくなります。先程2値化したときにネガポジ反転を行ったのは白い文字(1)のみを残して、影だった部分を黒い文字の縁(0)と重ねて消去するためです。この影だった部分が残っていると正しく文字を読み取れません(先程con=50、gamma=0.01でCuとCoは2値化せずとも検出可能と書きましたが、これはその補正をかけた段階で影が消えてなくなるためです。ただ、Paの文字の上半分は影と同程度の明度しかないので影と一緒に消えてしまいます。それを防ぐため、コントラストの調整やガンマ補正は弱めにかけて後からずらして重ねる方法で影だけを除去しました)。
これで見事に文字のみを真っ白な状態で抜き出せたので、これを画像として出力します。

tools = pyocr.get_available_tools()
if len(tools) == 0:
	print("No OCR tool found")
	sys.exit(1)

tool = tools[0]

txt = tool.image_to_string(
	Image.open(path_output),
	lang='jpn',
	builder=pyocr.builders.TextBuilder()
)
txt = txt.replace(' ', '')
txt = txt.replace(' ', '')
print(txt)

最後に文字をpyocrで読み取ります。関数1つで読み取れるのはすごいですよね。
返ってきた文字列は空白を含んでいることがあるのでreplaceで除去してから出力するようにします。


それでは早速実行してみましょう。

$ python3 idolName_OCR.py
姫川友紀

いけました!こんな感じでアイドルの名前を出力できます。
他の属性のアイドルも見ていきましょう。



f:id:shinemoon227:20181017201636p:plain
f:id:shinemoon227:20181017201838p:plain

$ python3 idolName_OCR.py
小早丿ーー紗枝

姫川の「川」がいけて小早川の「川」がいけないのはなんで???非常に惜しいんですけどね…



f:id:shinemoon227:20181017201817p:plain
f:id:shinemoon227:20181017201854p:plain

$ python3 idolName_OCR.py
、森久保乃々_}_`

こっちはこっちですごいことになってます。ただ、これは半角文字を全て取り除けばいいだけなのでまだ何とかなりそうです。



というわけで、OCRで完璧に名前を読むことが如何に難しいかということがよく分かる結果となりました。183人全員試すのは難しいですが、1文字も間違えずに出力できるアイドルはそこまで多くないかと思われます。
勿論スクショを撮ったタイミングが悪かったりする(キラキラしてたり白みがかってたり)とこれより更に精度は落ちますが、そうでなくてもこの結果なのでテンプレートマッチングを使って一致率が一定以上だった文字列を採用する方法のほうが確実でしょう。

{
\displaystyle
\begin{equation}
\end{equation}
}

結局ポテンシャル解放でプロデュースptはどう振り分けるのが正解なのか?(1)

こんばんは、むぅんです。
先月のデレステのアップデートにより、プロデュースptの上限が30から35に上がり、新たに特技発動率にもプロデュースptを割り振れるようになりました。記事を公開するのが遅すぎて先月どころの話ではなくなってしまいました。
それに伴い、これまでのVoDaViそれぞれに10ずつ振る振り方が最適解でなくなってしまったため、どのように振り分ければよいのかが分かりづらくなってしまいました。
そこで、ポテンシャル解放の最適解を求めるためにC++でプログラムを組んでみました。最初はPythonで書いていたのですが、シミュレートに日単位でかかることが判明したのでC++で1から書き直しています。
今回はひとまずパッションプリンセスの強そうなユニットで、各アイドルのVoDaViで一番低いステータスと特技発動率に余った15ptのうちそれぞれ何ptずつ振り分ければよいかを総当たりで調べてみたいと思います。スパークルに関しては未実装なので次回改めて調べてみます。

検証例

f:id:shinemoon227:20180927134857p:plain


後から気付いたのですが、ステータスの振り方はセンター効果依存(基礎スコアは合計アピール値によって決定され、ポテンシャル解放によるステータスの上昇幅はどこに振っても同じなため)でプリンセスの場合どこに振ろうがスコアには影響を与えないんですよね。ですが、例えばVoが一番高いのにVoにプロデュースptを振らないのは違和感がありますし、こう決めておくことで後々トリコロールのスコアを計算するときにも同じ方法が使えるため今回はこのまま進めていきたいと思います。

技術的なお話


ただ書きたかっただけなので読むのが面倒な方は適宜読み飛ばしてください。

Simulation simu(idol);
for(int p1=5; p1<=10; p1++){
	for(int p2=5; p2<=10; p2++){
		for(int p3=5; p3<=10; p3++){
			for(int p4=5; p4<=10; p4++){
				for(int p5=5; p5<=10; p5++){
					vector<int> p{p1, p2, p3, p4, p5};
					simu = simulateOneSet(simu, idol, p);
				}
			}
		}
	}
}


今回はこんな感じに頭の悪い総当たりで調べていきます。p1からp5までのカウンタをvectorとして渡していますが、これが特技発動率のプロデュースptの組となります。例えばp1=8のとき、1人目のアイドルの特技発動率に8pt振るのに対し、一番低いステータスに7pt振ることになります。
このプロデュースptの組を元にステータスを計算し、指定した曲を何回かAPしたときのスコア(例えば最大値や平均値など)をプロデュースptとのpairとしてvectorに格納したあと、スコアを元にソートをかけてプロデュースptの組を取り出します。
今回はこのプロデュースptの組をvectorで渡しましたが、整数で渡すことも可能です。例えば、2次元配列のあるインデックス \([i][j]\) は、 \(i\) が取りうる値が \((0 \leq i < n)\) のとき \([i*n+j]\) と計算することで1次元配列に変換できます。これを \(N\) 次元に拡張することを考えます。
インデックスが \(i_1, i_2, ... , i_N\) (ただし要素数はいずれも \(n\) )のとき

\begin{eqnarray}
j=\sum^N_{k=1}i_k n ^{N-k}
\end{eqnarray}

とすれば1次元に変換できます。また、 \(d\) 次元目のインデックス \(i_d\) は

\[
i_d = j \left( \frac{1}{n} \right) ^{N-k+1} \bmod n
\]

と求めることができます。これを用いて、例えば3次元のインデックス \([3][4][2] (n=5)\) は \([3*5*5 + 4*5 + 2]\) 、すなわち \([97]\) と変換でき、逆に \([97/5/5%5][97/5%5][97%5]\) を計算することで \([3][4][2]\) と復元することも可能です。実際に計算するときは5人分のアイドルのプロデュースptを5から10まで総当たりで調べることになるので、 \( n=6, N=5 \) のデータを格納することになります。今回は要素数が一定だったのでこの変換を用いたソートも可能でしたが、もっと複雑なループを行うと途端にわけがわからなくなるので今回は素直にvectorで表現することにしました。

void sortOthers(vector<pair<vector<int>, int>> &vec){
	sort(
		vec.begin(),
		vec.end(),
		[](const pair<vector<int>, int>& x, const pair<vector<int>, int>& y){return x.second > y.second;}
	);
}


地味に苦労したソートの部分です。前述したようにデータはpairで管理しており、ここではsecondの値をもとにソートしています。

void setTable(vector<Idol> idol){
	// 5人分(スキブを最優先して計算するためデクリメント)
	for(int i=4; i>=0; i--){
		int cScore, cCombo, mem = 0;
		double t;
		// 全ノーツ分
		for(int j=0; j<totalNotes; j++){
			t = sec[j];
			if(idol[i].begin[mem] > t){
				continue;
			}
			else if(idol[i].end[count[i]-1] < t){
				break;
			}
			else{
				for(int k=mem; k<count[i]; k++){
					if(idol[i].end[k] < t){
						mem++;
					}
				}
				if(idol[i].begin[mem] <= t && idol[i].end[mem] >= t){
					if(i == 4) isBoost[j] = true; // スキブの場合
					else{
						cScore = skillBonus[isBoost[j]][idol[i].skillName][0];
						cCombo = skillBonus[isBoost[j]][idol[i].skillName][1];
						bonusTable[j][0] = bonusTable[j][0] < cScore ? cScore : bonusTable[j][0];
						bonusTable[j][1] = bonusTable[j][1] < cCombo ? cCombo : bonusTable[j][1];
					}
				}
			}
		}
	}
}


そして今回一番苦労した特技倍率をセットする関数です。bonusTableという2×ノーツ数分の要素数の2次元配列を用意し、そこに各ノーツのスコアアップとコンボナの倍率を埋めていく関数ですが(例えば100ノーツ目のスコアアップが17%、コンボナが18%だった場合 bonusTable[99][0] = 17, bonusTable[99][1] = 18 といった具合です)、スキブの扱いが非常に難しく適当に組むとプログラムの実行にとてつもない時間がかかる始末でした。そこで特技がスキブのアイドルを4番目に配置している前提のもとスキブが発動しているかどうかを最優先で調べ、その結果に応じスコアアップ等の倍率を場合分けするという処理を1回のループ中で行うことにしました。スキブの確認とスコア倍率の計算という2つの異なる処理を同一関数の同ループ内で行うあまりに汚いプログラムを書くのは正直気が引けましたが、結果として17倍ほど高速化できたので個人的には大満足です。どうせ自分しか見ないプログラムだし多少はね?

検証結果


今回検証に用いたユニットはこちらになります。


センター Pa 限定 本田未央 9高 フォーカス
Pa 限定 片桐早苗 6中 フォーカス
Pa 限定 堀裕子 7中 オバロ
Pa 限定 高森藍子 11中 コンボナ
Pa フェス限 十時愛梨 8高 スキブ
ゲスト Pa 限定 本田未央


このユニットで生存本能ヴァルキュリアのMASTER+を1000回APしたときの理論値、最大値、平均値、上位1% / 4% / 15% / 30% / 50%(中央値)スコアをMatplotlibでプロットした結果を以下に示します。縦軸が特技に振ったプロデュースptの5人分の合計、横軸が順位です。ただし、ゲストは特技発動率に振っても意味はないためVoDaViに10ずつ振った状態で固定しています。

まずは平均値から見てみましょう。

f:id:shinemoon227:20180927010651p:plain

見事なまでに特技発動率に振ったほうが平均的に高スコアを叩き出せていることが分かります。相関係数は約-0.887、p値は0.001未満という綺麗な負の相関関係がある結果です。


続いて1000回APした内の最大値、すなわち特技の引きが最も良かったときの結果です。

f:id:shinemoon227:20180927010719p:plain

流石に1000回もAPしただけあり、必ずしも特技発動率に振ったほうが良いとは言えない結果です。発動率の低さを試行回数で稼ぐ形となり、ステータスを伸ばすような振り方をしていてもひたすら繋ぎ続ければやがて高スコアを叩き出すことができるようですね。ただ、Lv30の楽曲を1000回もAPできるかどうかを考えるとやはり特技発動率に振らないのは良い選択とは思えません。
ちなみに、相関係数はおよそ0.034で殆ど相関は見られませんでした。


次に上位1% / 4% / 15% / 30% / 50%スコアを見ていきます。これらのスコアはデレステ計算機さんに準じてみました。

f:id:shinemoon227:20180927010738p:plain
f:id:shinemoon227:20180927010747p:plain
f:id:shinemoon227:20180927010758p:plain
f:id:shinemoon227:20180927010815p:plain
f:id:shinemoon227:20180927010827p:plain

下位のスコアになるほどより強い負の相関があることが分かります。しかし、いずれも特技発動率に振ったほうがより高スコアを叩き出しやすいようです。


最後に理論値を見てみましょう。

f:id:shinemoon227:20180927010842p:plain

流石に理論値だけあって非常に綺麗なグラフになっています。当然全員の特技発動率に10振ったときに最もスコアが低く出ています。

ここまでのまとめです。


相関係数 p値
平均値 -0.887 <0.001
理論値 0.529 0.000
最大値 0.034 0.002
上位1% -0.629 <0.001
上位4% -0.750 <0.001
上位15% -0.817 <0.001
上位30% -0.846 <0.001
上位50% -0.870 <0.001



しかし、この結果だけではまだ特技発動率に振るべきとは言えません。ステータス重視の振り方をした場合、確かに理論値以外は大きく順位を落としていましたがそれだけではスコアがどれだけ落ちたか分からないためです。
というわけで、次はスコアの実数値を見ていきたいと思います。情報量が予想より遥かに多くなってしまったため次回に続きます。

おまけ


プログラムの実行にかかった時間の変遷です。先程の検証と同じく生存本能ヴァルキュリアのMASTER+を1000回シミュレートした場合の実行時間ですが、プロデュースptの組はVoDaViに10ずつ振った場合で固定してあります。実際の検証では7776通りの計算を行ったので、おおよそこれらの実行時間を7776倍すれば実際にかかる時間となります。

なお、下記に示す時間はtimeコマンドのrealの値となります。


完成直後(Python3) 15.759s
ファイル読み込みをループ外で行うよう変更 13.953s
特技倍率を調べる関数の見直し 12.043s
更に変更 10.316s
上記プログラムをC++で書き直す 1.333s
-O3オプションありでコンパイル 0.955s
特技に関する関数の最適化 0.056s


というわけでPythonが如何に遅いかがよく分かる結果となりました。書きやすさは圧倒的にあちらの方が上だったんですけどね…。
ちなみに、0.056秒という記録を叩き出した最後のプログラムで7776通りのシミュレートを行うと約7分12秒ほどかかりました。最初のプログラムで同じ回数だけ回すと1日以上かかる計算になるので頑張って書き直して良かったです。

{
\displaystyle
\begin{equation}
\end{equation}
}

2018年9月のデレステ宝くじシミュレータを作ってみた

f:id:shinemoon227:20180822000603p:plain

3周年のイメージカラーは紺色でしょうか



いつものやつです。今回は9等の当選枚数が99999999枚から無制限へと変更されましたが、実質前回と全く同一の宝くじと見て問題ないでしょう。
前回作ったシミュレータを流用しているため、入手できる宝くじの枚数はデフォルトで38枚になっています。
正確な枚数が分かり次第更新したいと思います。34枚に修正しました。


当選本数一覧 本数
1等 1本(変更なし)
2等 1000本(変更なし)
3等 3000本(変更なし)
4等 25000本(変更なし)
5等 750000本(変更なし)
6等 2500000本(変更なし)
7等 5000000本(変更なし)
8等 7500000本(変更なし)
9等(※) 無制限(実質変更なし)

(※) PLvが20に達しておらず、2ndパネルミッション未開放のプロデューサーは必ず当選



※実際の宝くじはシミュレータによって得られた通りの結果になるとは限りません。使用は自己責任でお願いします。

下のテキストボックスに全プロデューサーおよび自分が所持しているチケットの総数を入力してください。ただし、他人が持っているチケットの総数は分からないので入力するのは推定値となります。参考までに、デフォルトで入力されている15779001枚が8等までの総数です。それより多く設定すれば9等が当選するようになり、それより少なく設定すれば上位の当選確率が上がります。極端な話、上も下も34枚に設定すれば自分で34枚しかないチケットを全て独占している状態になるため1等が確実に当選します。
なお、ここで入力した値には9等しか当選しない(8等以上が当選する条件を満たしていない)チケットは含まれません。


全プロデューサーが所持しているチケットの総数:
      自分が所持しているチケットの総数:



プラチナメダルを集めるのにいくらかかるか計算するシミュレータを作ってみた

f:id:shinemoon227:20180728000855p:plain

個人的にはスタランを早く上げたいです


タイトルの通りです。プラチナメダルを任意の枚数集めるまでに大体いくらかかるかを計算してくれます。
実行するたびに結果は変わるので色々試してみてください。

※プログラムが間違っている可能性は十分に考えられるので、使用は自己責任でお願いします。
【7/28追記】1個あたり7/6円であるスタージュエルの価格を誤って6/7円で計算していたので修正しました。あまりに致命的すぎる
【7/29追記】シンデレラフェスおよび限定ガシャの恒常枠を誤って102種としていたので修正しました。正しくは103種です。



なお、各SSRの排出率(特にシンデレラフェス)は毎回変わって実装が面倒だったので、ここではプラチナメダルが実装された時点での直近のガシャでシミュレートします。すなわち、シンデレラフェスは2018年6月の「[うたかたの結び手] 依田芳乃」が追加されたガシャ、限定ガシャは2018年7月の「願いを連ねて 七夕浴衣ガシャ」、恒常ガシャは2018年7月の「[P.C.S] 五十嵐響子」が追加されたガシャとなります。


まず、ガシャの種類を以下から選択します。

【シンデレラフェス】

SSRの確率は6%です。

ピックアップ枠1(0.750% × 1種):
  [うたかたの結び手] 依田芳乃
ピックアップ枠2(0.078% × 5種):
  [ピースフルデイズ] 島村卯月などの旧Vi特化フェス限
ピックアップ枠3(0.031% × 12種):
  [ワンダーエンターテイナー] 本田未央などのその他フェス限
恒常SSR(0.044% × 103種):
  [イン・ヒューマン] 高峯のあまでの恒常SSR

【限定ガシャ】

SSRの確率は3%です。

ピックアップ枠1(0.400% × 2種):
  [星祭りの夜] 鷺沢文香 / [モンスター・パーティー!] 早坂美玲
ピックアップ枠2:
  なし
ピックアップ枠3:
  なし
恒常SSR(0.022% × 103種):
  [イン・ヒューマン] 高峯のあまでの恒常SSR

【恒常ガシャ】

SSRの確率は3%です。

ピックアップ枠1(0.750% × 1種):
  [P.C.S] 五十嵐響子
ピックアップ枠2:
  なし
ピックアップ枠3:
  なし
恒常SSR(0.021% × 104種):
  [超☆志貫徹] 冴島清美までの恒常SSR


次に、下のテキストボックスに目標のプラチナメダルと今現在自分が持っているSSRの種類を入力します。ここの数字を増やすと、最初からある程度アルバムが埋まっていることになるので早くプラチナメダルが貯まりやすくなります。
それぞれ入力できる最大値は次のようになります。


シンデレラフェス 限定ガシャ 恒常ガシャ
ピックアップ枠1 1 2 1
ピックアップ枠2 5 0 0
ピックアップ枠3 12 0 0
恒常ガシャ 103 103 104


また、プラチナメダルは1000枚まで目標として設定できます。
最後に、詳細を表示するかどうかチェックを入れます。ただし、詳細は非常に長いのでプラチナメダル200枚以下のときのみ表示できます。

なお、ここでかかる金額は最も1個あたりの価格が安いスタージュエルG(1個あたり7/6円)で計算しています。



ガシャの種類:

目標プラチナメダル:
ピックアップ枠1: 種所持
ピックアップ枠2: 種所持
ピックアップ枠3: 種所持
    恒常SSR 種所持
詳細を表示する(出力結果は非常に長くなることがあります)



2018年6月末のフェス限予想

f:id:shinemoon227:20180225161112p:plain


今月もやってきました。シンデレラフェスです。
前回の予想はこちらからどうぞ。


shinemoon227.hatenablog.jp



Cu Co Pa
2016/6 島村卯月(Vi) 渋谷凛(Vo) 本田未央(Da)
2016/9 輿水幸子(Da) 高垣楓(Vi) 城ヶ崎美嘉(Vo)
2016/12 安部菜々(Vo) 塩見周子(Da) 大槻唯(Vi)
2017/3 速水奏(Vo)
2017/6 前川みく(Vi)
2017/8 十時愛梨(Da)
2017/10 アナスタシア(Vi)
2017/12 双葉杏(Da) 諸星きらり(Vo)
2018/2 一ノ瀬志希(Vo)
2018/4 神崎蘭子(Da)



周期は現在2周目の3セット目に突入しており、次回フェス限はPaViで確定です。
いつも通り「PaでまだVi特化としてSSR化されたことがなく、かつJewelies参加済みで現在SSRが2周しているアイドル」を書き出してみると高森藍子姫川友紀相葉夕美市原仁奈赤城みりあとなります。
これまではあーちゃんで来るという見方が強かったですが、先月末モバマスであーちゃんのSRが追加されたため可能性は低くなってしまいました。しかし、過去にモバマス実装後わずか2週間でデレステに限定SSRが実装された鷺沢文香のような前例もあるので可能性がゼロになったわけではありません。この中で2番目にSSR追加、SR追加から時間が経っているのは夕美ちゃんなので、もしあーちゃんでなければ恐らく夕美ちゃんです。

しかし、最近は特化が被っているアイドル(両方Vi特化の喜多見柚、1周目と3周目がVo特化の佐久間まゆ)も登場しており、傾向を読み取るのは困難となってきました。これまでフェス限の特化が被ったことはないので今回はこのままあーちゃん予想でいきたいと思いますが、もし特化がこのフェスで被ってしまったら次回以降の予想は自信がないので予想するかは検討したいと思います。


また、ステータスの配分は完全に適当だということが分かったので予想はキリよく今回で最後にしたいと思います。今のところCBA型が若干少ないのでこっちに賭けますが当たっても運が良かっただけです。


登場回数
ABC 3
ACB 3
BAC 1
BCA 3
CAB 5
CBA 2



今回のまとめです。


高森藍子(3周目)
  ボーカル:1671
   ダンス:2388
 ビジュアル:11641
センター効果:シンデレラチャーム
    特技:トリコロール・シナジー(11秒毎、高確率でしばらくの間)



もし今回当たれば、2月に行った予想でアイドルは全員的中していたことになるので楽しみです。


shinemoon227.hatenablog.jp

色違いポケモンの入手法まとめ

主に自分用です。色違いポケモンの出現率を上げる方法は世代を追うごとに増えているのでまとめておきます。


【確率を一時的、または恒久的に上げるためのもの】

\( (A) \) ひかるおまもり

【対象作品】BW2以降全て
【判定回数】\( +2 \) 回

SM以前は全国図鑑完成、SM以降はアローラ図鑑完成で貰えるたいせつなどうぐです。入手以降、恒久的に色違いになるかどうかの判定回数が2回増えます。これはフレンドサファリウルトラホール、人から貰うポケモンを除きあらゆる場所で効果を発揮し続けます。

以下、ひかるおまもりによる判定回数の増加を \(c\) で表します。所持していれば \(c=2\) 、所持していなければ \(c=0\) となります。

\( (B) \) おまじないパワー+++/S

【対象作品】BW2
【判定回数】\( +1 \) 回

BW2限定のデルパワーです。+++は3分間、Sは30分間発動し色違いの判定回数を1回増やします。同時に野生ポケモンの出現テーブルも変動するため元々出現率が高いポケモンの色違いを狙うには少々不向きです。
Sの解禁は現在非常に困難で、BW2発売当時も地方在住民には人権がありませんでした。僕もその内の1人でした。



【色違いを狙うための手法】

\( (1) \) ポケトレ(第4世代)

【対象作品】DPt
【難易度】 ★★☆☆☆ ~ ★★★★★
【入手効率】★★★★★
【特定のポケモン】確実に狙える

【出現率】 \( \displaystyle\frac{{\rm ceil}\left(\displaystyle\frac{65535}{8200-n'×200}\right)}{65536} \) \( ( n' = {\rm min}(n, 40)) \)

【最大出現率】約 \(\displaystyle\frac{1}{199}\)

\(n\) は連鎖数を表します。

色違いポケモンを出現させやすくする手法としては最も古いものになります(→第2世代の孵化法を忘れていました)。ポケトレは「使用すると草むらが数箇所揺れ、そこからポケモンが飛び出してくる」というアイテムですが、連続で同じ種類かつ同じLvのポケモンに出会うことで連鎖しているという状態になり、これを繰り返すことで色違いの出現率が上がるというのが特徴になります。連鎖はあらゆる手法で出てくる用語で、色違い入手の要とも言えるものになります。ポケトレを起動したときに揺れた草むらが光れば、そこからは連鎖中のポケモンが必ず色違いで出現します。色違いの出現率は40連鎖まで上がり続け、最終的に\(\displaystyle\frac{328}{65536} \approx \frac{1}{199}\)まで上昇します。また、草むらは最大で4箇所揺れ、それぞれ色違いの判定が行われるため実際の確率はこれより遥かに高いです。

この手法最大の特徴は何と言っても史上最高の捕獲効率を誇ることにあります。色違いを捕まえても連鎖数はリセットされず、色違いの確率はそのままなので操作ミス等で連鎖が途切れない限りいくらでも捕獲を続けることができます。そのため、同じ種類のポケモンという制限こそあるものの、色違いでボックスを埋めることも容易であるというのが他にはないポケトレの魅力です。

その一方、連鎖は非常にシビアなものとなっています。ポケトレを起動した地点より周囲4マス分離れた場所の揺れ(4殻といいます)が最も連鎖成功確率が高く設定されていますが、そこでも確率はわずか88%しかありません。

\( (2) \) ポケトレ(第6世代)

【対象作品】XY
【難易度】 ★★★★☆ ~ ★★★★★
【入手効率】★☆☆☆☆
【特定のポケモン】確実に狙える

【出現率】 \( \displaystyle\frac{1}{8100-200n'} \) \( ( n' = {\rm min}(n, 40)) \)

【最大出現率】 \(\displaystyle\frac{1}{100}\)

\(n\) は連鎖数を表します。ただし、音楽変化中の出現率は連鎖数にかかわらず \( \displaystyle \frac{1}{100} \) となります。

XYのポケトレも第4世代のポケトレ同様、40連鎖まで確率が上昇し続けます。戦闘終了後、 \(2\%\) の確率で音楽が切り替わり、確率が \( \displaystyle \frac{1}{100} \) で固定されます。以降は、ポケトレ再起動時または戦闘終了時に \(50\%\) の確率で音楽が元に戻るかどうかの判定がなされます。
こちらのポケトレは第4世代と比べ揺れが見にくかったり、草むらが非常に小さく4殻ルールが守れなかったりするため、連鎖難易度は非常に高くなっています。また、連鎖を続けていくと個体値が何箇所かV確定になるように仕様が変更された代わりに、色違いを捕獲すると確率がリセットされるようになり、乱獲が可能というポケトレ最大にして唯一の利点が完全に無くなりました。よって、特別な理由がない限りこの方法で色違いを狙うのはオススメできません。
多くの形態に分岐しここ以外で狙うことができないミノムッチは狙う価値がありますが、草むらは非常に狭く連鎖を続けるのは困難を極めます。

\( (3) \) 国際孵化

【対象作品】DPt / HGSS / BW / BW2 / XY / ORAS / SM / USUM
【難易度】 ★★★★☆
【入手効率】★☆☆☆☆
【特定のポケモン】確実に狙える

【判定回数】\( +3 \) 回(第4世代)
      \( +5 \) 回(第5世代~)

【出現率】 \( 1-\displaystyle\left(\frac{8191}{8192}\right)^{4} \)(DPt / HGSS
      \( 1-\displaystyle\left(\frac{8191}{8192}\right)^{6} \)(BW)
      \( 1-\displaystyle\left(\frac{8191}{8192}\right)^{6+c} \)(BW2)
      \( 1-\displaystyle\left(\frac{4095}{4096}\right)^{6+c} \)(XY~)

【最大出現率】約 \(\displaystyle\frac{1}{512}\)

第4世代以降の全ての作品にある手法です。増田部長のブログで明らかになるまで1年2ヶ月も知られていなかったという変わった経緯があります。
国際孵化はタマゴを作る際、片親を海外産(タマゴを受け取ったROMの言語が日本語でなければ良い)にすれば色違いが生まれる確率が高くなります。どの手法よりも高個体値を入手しやすく、タマゴ技との両立も可能なので実戦投入しやすいのが最大の特徴です。以前は目的の個体値の遺伝抜けにより理想個体が出るまで産み直しを余儀なくされていましたが、現在は王冠の使用により特性さえ一致していれば多くのポケモンは一発で採用できるでしょう。
「タマゴからどのポケモンが生まれてくるか」と「タマゴから生まれるポケモンが色違いかどうか」が決定するまでのタイミングのズレを利用した固定孵化が作品ごとに考案されてきましたが、第7世代ではコイキングをボックスに一定数貯め続けることで孵化までの時間を大幅に短縮することができるようになりました。詳細は各自でググってください。

\( (4) \) 連続釣り

【対象作品】XY / ORAS
【難易度】 ★☆☆☆☆
【入手効率】★★★★☆
【特定のポケモン】狙えない(出現率に依存する)

【判定回数】\( +2n' \) 回 \( ( n' = {\rm min}(n, 20)) \)

【出現率】 \( 1-\displaystyle\left(\frac{4095}{4096}\right)^{1+c+2n'} \)

【最大出現率】約 \(\displaystyle\frac{1}{95}\)

\(n\) は連鎖数を表します。

連続釣りとは同じ種類のポケモンをひたすら釣り続けると色違いが出やすくなるという手法で、他の手法の連鎖と異なり逃げても確率は継続します。
この手法最大の特徴は何と言っても判定回数の多さで、何と1連鎖するごとに色違いになるかどうかという判定が2回ずつ増えるという他の手法も真っ青な増加率です。最大は20連鎖ですが、そのときは色違いになるまで判定を41回も繰り返します。連続釣りはひかるおまもりの効果を受けますが、最早2回増えた程度では確率は殆ど変動しません。

\( (5) \) フレンドサファリ

【対象作品】XY
【難易度】 ★☆☆☆☆
【入手効率】★★★☆☆
【特定のポケモン】狙いにくい(約1/3)

【判定回数】\( +4 \) 回

【出現率】 \( 1-\displaystyle\left(\frac{4095}{4096}\right)^{5+c} \)

【最大出現率】 約 \(\displaystyle\frac{1}{585}\)

フレンドサファリはXYに登場する施設です。そこで出現するポケモンは光る確率がかなり高めに設定されています。フレンドサファリに出現するポケモンとその進化系だけで全ポケモンの半数近くを占めており、非常に多くのポケモンの色違いを用意に入手することが可能です。
ひたすら野生ポケモンに出会っては逃げるの繰り返しで、慎重な作業も不要なので片手間に粘るのに非常に向いています。ただし、目的のポケモンが出現するサファリを手に入れるのが若干難しいのがフレンドサファリの弱点です。本気でサファリ粘りをしたいなら3DSを中古で購入してリセマラをするのも手です。
ちなみに、フレンドサファリではひかるおまもりの効果が発揮されないと言われています。殿堂入り後すぐに粘れるようになるのも嬉しいですね。ひかるおまもりの効果も発揮されるようです。確率は国際孵化より若干低めですが、それでも試行回数を稼ぐのが圧倒的に楽なのでオススメです。

\( (6) \) ずかんナビ

【対象作品】ORAS
【難易度】 ★★★☆☆~★★★★☆
【入手効率】★☆☆☆☆
【特定のポケモン】確実に狙える

【出現率】 \( 1-\displaystyle\left(\left(\frac{4095}{4096}\right)^{1+b} \left( \frac{1}{25}(1-p)^{1+b+c+4} + \frac{24}{25}(1-p)^{1+b+c}\right) \right) \)
ただし、サーチレベルを \(s\) とすると、

\(
d = \begin{cases}
s+600 & (200 < s\leq999) \\
2s+400 & (100 < s\leq200) \\
6s & (0 < s\leq100)
\end{cases},\
d' = {\rm ceil}\left(\displaystyle\frac{d}{100}\right),\
p = \displaystyle\frac{d'}{10000}
\)
また、
\(
b = \begin{cases}
10 & (99\ 連鎖) \\
5 & (49\ 連鎖) \\
0 & (それ以外)
\end{cases}
\)

【最大出現率】約 \(\displaystyle\frac{1}{173}\)(連鎖数は49、99以外)

出現率の式が非常に面倒な形をしているのがずかんナビによるサーチです。ずかんナビを使用すると、草むらや洞窟等に隠れているポケモンの体の一部が見え隠れし、それにそっと忍び寄ると戦闘が始まります。これを繰り返していくと色違いの出現率が上がると思われがちですが、実際に連鎖を繰り返しても確率が上がることはなく、丁度49連鎖と99連鎖にちょっとしたボーナスがある程度です。ずかんナビの出現率はサーチレベルに大きく依存し、そのポケモンに今まで何回出会ってきたかによってほぼ一意に定まります。集中力を必要とする割には出現率は高くなく、サーチレベルがカンストしていても \( \displaystyle \frac{1}{173} \) 程度です。特に、洞窟や海上では5連鎖以降急激に連鎖の難易度が跳ね上がり、何度もやり直しを余儀なくされることからもあまりオススメできません。狙ったポケモンの色違いを確実に手に入れられる点は優秀だと思いますが、第7世代の仲間呼びがこれのほぼ上位互換にあたるので、どちらの作品でも出現するポケモンであれば無理してずかんナビで粘る必要性はなさそうです。

\( (7) \) 群れバトル

【対象作品】XY / ORAS
【難易度】 ★☆☆☆☆
【入手効率】★★★☆☆
【特定のポケモン】狙えない(出現率に依存する)

【判定回数】\( ×5 \) 回

【出現率】 \( 1-\displaystyle\left(\frac{4095}{4096}\right)^{5(1+c)} \)

【最大出現率】約 \(\displaystyle\frac{1}{273}\)

群れバトルはあまいかおりを特定のフィールド上で使用することで5匹の野生ポケモンと同時に戦うバトルです。ただし、XYは雨が降っているとあまいかおりで群れバトルを発生させることができません。
本質的には野生ポケモンと5回戦うのと変わらないので、出現率はほぼ5倍となります。ひかるおまもりの効果を強く受けるので、群れバトルで色違いを狙う際は是非とも入手しておきましょう。

\( (8) \) 仲間呼び

【対象作品】SM / USUM
【難易度】 ★☆☆☆☆
【入手効率】★★★☆☆
【特定のポケモン】狙えない(出現率に依存する)

【判定回数】\( +r \) 回

ただし、連鎖数を \(n\) とすると、

\(
r = \begin{cases}
0 & (1 \leq s < 10) \\
4 & (10 \leq s < 20) \\
8 & (20 \leq s < 30) \\
12 & (30 \leq s)
\end{cases}
\)

【出現率】 \( 1-\displaystyle\left(\frac{4095}{4096}\right)^{1+c+r} \)

【最大出現率】約 \(\displaystyle\frac{1}{273}\)

長らく70連鎖以降判定回数+3回という情報が信じられていましたが、最近の解析でそれより遥かに確率が高かったことが判明しました(以前よりYoutubeで色違いの動画を大量に投稿している人たちがいますが、仲間呼びに関しては明らかに平均1000回超といった感じではありませんでした)。
判定回数は最大で12回となり、国際孵化よりと比べてもかなり高めの設定です。連鎖数も30と手の届きやすい回数で、連鎖方法もただ同じポケモンを呼び続けてもらうだけなので連続釣りやフレンドサファリ並にオススメの方法であると言えそうです。

\( (9) \) ウルトラホール

【対象作品】USUM
【難易度】 ★☆☆☆☆
【入手効率】★★☆☆☆
【特定のポケモン】狙えない(ごく一部のポケモンのみ)

【出現率】 ホールの種類を出現率が高い順に \(h=0,1,2,3\) とおくと、色違いの出現率 \(r\) は

\(
r = \begin{cases}
d\% & (h=0) \\
(1+d)\% & (h=1) \\
(1+2d)\% & (h=2) \\
4d\% & (h=3)
\end{cases}
\)

ただし、光年を \(l\) とすると、
\(\displaystyle d = {\rm min}\left(9, {\rm ceil}\left( \frac{l}{500}-1 \right)\right) \)

【最大出現率】\(36\%\)

ウルトラホールは現在色違いの出現率が最も高い場所になります。
やり方は簡単、ウルトラホールで光年を稼いで珍しいホールに入るだけです。ただし、最も珍しいホール \((h=3)\) は通常伝説ポケモンが確定で出現します。このホールでは、伝説ポケモンを全種捕獲した後にのみ通常ポケモンの色違いを狙うことが可能になります。光年を伸ばせば伸ばすだけ伝説ポケモンになる確率も高くなるので、効率を求めるなら予め全て捕獲しておくと良いでしょう。
ただし、いくら遠くまで行っても珍しくないホールに突入してしまうと確率は一気に落ちてしまうので、ある程度のところまで進めたら二番目に珍しいホール \((h=2)\) に突入することをオススメします。
また、ウルトラホールで出現する野生ポケモンが色違いかどうかはホールに入った瞬間に決定します。すなわち、一度色違いと決まれば何度リセットしても色違いのままです。性格や個体値を気にするなら、捕獲前にレポートを書いておきましょう。

\( (10) \) 第2世代色違い孵化法(ここでの独自の呼び方です)

【対象作品】金銀クリスタル(VC含む)
【難易度】 ★★☆☆☆
【入手効率】★★★★☆
【特定のポケモン】確実に狙える

【(最大)出現率】 \( \displaystyle\frac{1}{64} \)

最後に紹介するのは第2世代の孵化法です。第2世代では個体値で色違いかどうかを判定しているため、親の個体値を引き継ぐ孵化で色違いポケモンを親にすれば子も色違いである確率が高くなるという手法です。
第1世代で色違いメタモンを入手する方法が最も簡単ですが、ここでは方法を書かないので各自でググってください。
一度親を用意しさえすれば第2世代までのポケモンの色違いは容易に入手できるようになりますが、当時はほのおのからだ、マグマのよろいや孵化パワーはない時代なので生まれるまでに思ったより時間がかかるかもしれません。



【まとめ】

手法 確率 備考
ポケトレ(第4世代) \( \displaystyle \frac{1}{199} \) 40連鎖まで耐えれば乱獲可能
ポケトレ(第6世代) \( \displaystyle \frac{1}{100} \) 基本やらなくていい
国際孵化 \( \displaystyle \frac{1}{512} \) 一部ポケモンでは避けて通れぬ道
連続釣り \( \displaystyle \frac{1}{96} \) 一瞬で光る
フレンドサファリ \( \displaystyle \frac{1}{585} \) ネットサーフィンしながらできる
ずかんナビ \( \displaystyle \frac{1}{173} \) 草むら以外でやるべきではない
群れバトル \( \displaystyle \frac{1}{273} \) 割とすぐ光る
仲間呼び \( \displaystyle \frac{1}{273} \) PP切れが最大の敵
ウルトラホール \( \displaystyle \frac{1}{3} \) 特定のポケモン狙いは意外と面倒
第2世代孵化法 \( \displaystyle \frac{1}{64} \) 環境さえ整えば楽

※確率はざっくりした値です

{ \displaystyle
}