rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

ストレイテナーと確率10続(テナートリビュートの6問以上正解確率)

続き。
(前半はこちら)

ストレイテナー20周年企画トリビュートアルバム「PAUSE」における、
参加曲&アーティスト12の組み合わせのうち、正解の組み合わせ1つを当てる確率は、
理論値では1/12!=2.09×10-9であることがわかっている。
これは宝くじで1等を当てる確率の約1/50であり、むちゃくちゃ低確率である。
前回の記事では、これをシミュレーションしようとしてプログラムを作ったが、
低スペックマシン故に100億回試行するのに33時間かかるという
絶望的な処理予想時間をたたき出しため、
精度の高い実験は難しいことがわかっている。

しかしトリビュートアルバムの組み合わせクイズには、
6問以上正解者に対する個別プレゼントが用意されている。
直感的にも、「全問正解」に比べて確率が高いことは容易に予想ができる。
本項ではその「6問以上正解」の確率シミュレーションを実施する。
※書いてみて振り返ってみると、
 「ストレイテナー」と銘打ったタイトルの割に、
 中身は思った以上に数学(大した数学の話でもないが)・プログラムチックな話が多くなってしまった。
 なのでそっち系苦手な方はご注意ください。
 (あんまりテナーの話してません、という意味です。)



 


実験用のプログラムは非常に簡単に実装できる。
ランダムで組み合わせを決めた後、「正解」と照合するとき、
一致していた組み合わせが6以上あるかどうかをチェックするだけでよい。
「正解数のカウント」については、例えば

	private static int correctCount(String[] randomChoise,String[] answerArr) {
		List<String> randomChoiseList = new ArrayList<String>();
		for (int i=0; i < randomChoise.length; i++) {
			randomChoiseList.add(randomChoise[i]);
		}
		List<String> answerList = new ArrayList<String>();
		for (int j=0; j < answerArr.length; j++) {
			answerList.add(answerArr[j]);
		}
		int correctCount = 0;
		for (int k=0; k < randomChoiseList.size(); k++) {
			String randomChoiseStr = randomChoiseList.get(k);
			if (answerList.contains(randomChoiseStr)) {
				correctCount++;
			}
		}
		
		return correctCount;
	}


というメソッドを一つ用意し、ループの中から呼び出せばいい。

ひとつ重要なのは、「6問以上正解」「全問正解」は別の考え方であるという点だ。
「全問正解」は当然ながら「6問以上正解」を満たすわけだが、
「全問正解」した時点でそれ専用の特別な賞に該当するので、
「全問正解」は「6問以上正解」より優先される。
つまり「6問以上正解」の正確な定義は「6問以上11問以下正解」と見るのが正しいだろう。

よって↑のメソッドで得られた「正解数」を

int correctCount = correctCount(randonChoise , answerArr);
if (correctCount >= 6 && correctCount <= 11) {
	// 6問以上正解
	…
}


として判定する必要がある。
ただ、よくよく考えればわかることだが、このケースにおいて、「正解数11」というのは存在しない。
母数が12個しかないので、11個の組み合わせが確定した時点で残り1つは必然的に決まる為、
11個正解している=残る1つも正解に決まっている=12個正解している=全問正解である。
よってcorrectCount=11のケースは実質発生し得ない。




理論値の追及もしてみたが、一般化公式が導けなかったのと(w、
とりあず簡単に実装できたこともあって取り急ぎ実験を行ってみる。
結果は以下の通りとなった。(15億回試行させてみた結果)

…(これより↑のダラダラしたログは省略)…
2017/09/08 22:17:45.284 6問以上正解数=890161、正解率=5.934406666666666E-4


5.934×10-4という数値を得た。

これは約1700分の1という値なので、
全問正解の約5億分の1に比べればはるかに高確率といえる。
適当に答えるだけの人間が1700人いても、その中で正解するのが1人はいる計算になるからだ。




ところでこのクイズ、参加するにはTwitterアカウントが必要らしいが、
Twitterアカウントは別に一人ひとつと決まっているわけではない
(いわゆる「垢分け」して複数持っている人も多数いる)から
クイズ用にアカウントを作りまくって何個も持てば一人で正解率をあげることも可能であろう。
「無作為に指定するだけでも1700人に一人は6問以上正解」するというのがわかっているから
Twitterアカウントを1700個用意して
かぶらないように適当に割り振るだけでも6問以上正解は結構な高確率で目指せるだろう。
(まあでも一人で1700アカウントは現実的ではないか…)
全問正解となるとTwitterアカウントが5億程必要になる計算だが
Wikipedia見ると2016年7月現在でTwitterの全世界のユーザ数が3億1300万人とのことなので、
それを超える数のアカウントを一人でこしらえるというのは不可能だろう。
サマーウォーズを連想させるほどの莫大な数のアカウントが必要である。

ただ、一人で1700アカウントは無理でも、
「みんなで1700アカウント」は、正直いけなくもない気がするし、
むしろテナーファンのTwitterアカウント数としては少ない気さえする。
なので、1700人のテナーファンがTwitterで徒党を組んで、
みんながみんな「とりあえず適当に回答する」ってやったらそのうち1人は恐らく6問以上正解する。
まあクイズに参加するテナーファンの人は
基本的にみんな「当てに来る」わけなので、「無作為に指定する」という選択を取る人がいるとは思えないため
貴重なクイズ挑戦権(=アカウント)消費覚悟で「適用に指定しに行く」という人はまずいないだろうが。

そして重要なのは、ここまでの話は、あくまで確率の数値だけを見たときの話であって、
今までの実験結果からもわかる通り、
「1700分の1」だからといって1700回(人)挑戦すれば必ず当たることを保証するものでもないし、
そもそも前回紹介したようにある程度「この組み合わせは鉄板!」というのがある以上、
クイズの正解は最早確率だけに左右されるものではなくなっている。
要するに確率の数値と実際の当選確率を対比して考えること自体意味がない。
自分のやりたいように、思う答えを投票するのが正しいだろう。

まあでもどうせなら当てたいよね!
当選する為なら「1700くらいなら…」ってちょっとマジになって考えたくなるほど当てたい。
それだけの魅力がストレイテナーにはあるのだ。
2013年武道館のときだって「俺が指定した曲を演ってくれるかもしれない!」と考えると
スクリプト組んででも投票しまくりたいとふと思ったことがあるほどだからだ。
(やってませんよ!w投票し続けていた「KAISER LEE」はランク外だったし)
正直中にはいるんじゃないかと少し疑っているほどでもある。
テナーファンとして節度とマナーを守って企画に参加しないとね。