rm /blog

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

ストレイテナーと確率3(本当にCLONEは「よく耳にする」わけではないのか?)



前回の続き。

前回は「60分以内にどの曲が選ばれやすいか?」というのをシミュレーションした。
1.シングル・アルバムで重複している曲程選ばれやすい
2.演奏時間が短い曲程選ばれやすい
以上の2点が「選ばれやすさ」-選択頻度-を上げる要因になっていることがわかった。
結果的に、1.の点において4つの重複を持つ「SIX DAY WONDER」が堂々の1位となった。

なったわけだが、その後も何度かシャッフル再生し続けていたらやっぱりどうもCLONEを耳にする頻度が高い気がしてならない。
前回の検証においてはCLONEは重複点と演奏時間の関係上、選ばれやすさでいえば11位だったが、
この前なんか10曲目CLONE(CREATURES)⇒11曲目(忘れた)⇒12曲目CLONE(ベスト)という並びになったのだ。
本当にCLONEの選ばれやすさが11位なら、相当レアな確率を引き当てていることになる。
というわけで今回は視点を変え、「CLONE」という曲に着目して、
”本当にCLONEは選ばれやすいわけではないのか?”というのを考えてみたいと思う。


 

 
この問題を考えるとき、最初は理論的に考えてみようと考えた。
手持ちのストレイテナー257曲の中で、インストを除く3つのCLONEのうち、
1つ目のCLONEは少なくとも何曲目までに選ばれているのか?

というのがひとまず着目したポイントである。
冒頭に書いた例でいえば、会社への往復中(120分以内)で最低2回聴いている気がするが、
2回目以降を考え出すと少し複雑になるので、
とりあえず1回目にだけ注目して考えてみたい。

1曲目に選ばれるときは、インスト除く3つのCLONEがストレイテナー全曲257曲の中から選ばれるので、3/257=0.0116…
これは簡単。
ちなみに1.16%である。
100回聴いていれば1回はあり得る確率。
1%以上あるから正直この時点で比較的高確率だと感じる。


2曲目以降に選ばれるときは、直前まで選ばれていない(3つのCLONE以外の曲から選ばれ続けている)というのを考慮する必要があるので
2曲目に選ばれるときは、(254/257)*3/256=0.011582…
3曲目に選ばれるときは、(254/257)*(253/256)*3/255=0.01149…
一般に、
n曲目に選ばれるときは、(254Pn-1/257Pn-1)*3/(257-n+1)(1≦n≦257、Pはパーミュテーション)
でその確率が計算される。
※ちなみに定義的にはnP0は1なので、1曲目に選ばれるとき(n=1の場合)にも適用(計算)できる。

なんとなく、2曲目における選ばれやすさのほうが、1曲目における選ばれやすさよりは高い気がしたのだが、
計算結果は1曲目の選ばれやすさ>2曲目の選ばれやすさになり、つまりnが大きくなればなるほどその確率は減っていく。
これは、シャッフルで曲を聴いている中で、「次はこの曲かも」と予想したとき、
既に聴いている曲を除いた中から選択することになるから、「母数が減ってる分選ばれやすいだろう」という直感的な考え方によるものだろう。
ただ1曲目から全体を通してみたときには、「次に選ばれる曲の母数が減っている」というよりは
「既に選んだ曲を目当ての曲以外から選び続けてきた」確率の方が強い要素を包含していたということか。

1曲目に選ばれるときと、2曲目に選ばれるときは、
「1つ目のCLONEが選ばれる」という前提のもとではそれぞれ排他的に起こり得る(1曲目に選ばれてたら2曲目にCLONEが選ばれたとしてもそれは「1つ目のCLONE」じゃなくなる)から、
「少なくとも2曲目までに選ばれる確率」は両者の和となり、0.0116…+0.011582…=0.023255…、約2.23%となる。
同様の考え方でいくと、

n曲目
(少なくともこの曲順までに、という意)確率

10 0.112670591…
20 0.216543402…
30 0.311976067…
40 0.399326219…
50 0.478951491…
60 0.551209516…
70 0.616457928…
80 0.67505436…
90 0.727356446…
100 0.773721818…

という感じになっていく。
節目となるのは大体50%超えなのだろうが、ちょうど53曲目あたりで50%を超える。

数学的な視点で見ると、この値は単調増加であるようで、後半微妙に伸び悩んでいる。
n=30くらいまでは比較的順調に単調増加するが、そこを超えたあたりから数値が増えづらくなる。
パーミュテーションがあるので次数の考え方がよくわからんが、結果的には分数関数の動きに近くなるような気がしている。
理屈でいっても、n=255で1に収束する(※)から、「比較的緩やかに収束する分数関数」というのが実際のところなのだろう。
(※)1つ目のCLONEでさえ、”最も選ばれにくい”とすると、
理論的には「最後の3曲までCLONEが1曲も出てこない」というパターンが考えられる。
このパターンでは255曲目になって初めてCLONEが選択され、その後(もうそれしか選択肢がないから)256曲目・257曲目とCLONEが2曲続けて選ばれる。
よって、全部で3曲あるので、「1つ目のCLONE」に限定した場合は、その判断はn=255で最後。
つまり、254曲目までCLONEが選ばれてなければ、255曲目は(シングル・アルバムの区別をつけなければ)必ずCLONEが選ばれるというわけだ。

また、前回シミュレーション結果の「60分以内に平均的に聴くストレイテナーの曲数は大体14~15曲」というのに基づけば、
14曲目:0.155255422…、15曲目:0.165684367…で、その確率は約15%~16%になる。
つまり会社への往復に際して、100回シャッフル再生すれば最低15回は耳にしてるだろう、
という感じなるのか。
いずれにせよ、そこまで低くない確率でにあるように思う。
(ただ、経験則から感じる「CLONE聴きやすい」とはやはりまだ乖離がある)



さて、実際にシミュレーションをしてみるとしよう。
今回もシミュレーション用のプログラムを作ってみた。
試行回数を引数で受け取る部分と、曲のリストを外部ファイルから読み込むところは前回の流用。
シミュレーションは以下の流れで行われる。

(1)引数チェック
試行回数を受け取る。数値チェックと、数値だとしても負数なら例外発生して終了。

(2)曲リスト読込
外部ファイルのストレイテナー曲リストを読み込んでListにして返却。

(3)シミュレーション メイン処理
以下の処理をシミュレーションの「1試行」とし、(1)の引数分繰り返す。
①曲リストからランダムに1曲選択、選択対象のリスト内からその曲を除外(List#remove)
②インストだったら①へ戻る、インストじゃなければ③へ進む
③演奏時間を総和計算用変数に加算(その際Calendar.getTimeZone().getRawOffset()を加算)
④曲名をチェックし、"CLONE"なら曲順と、その時点での合計演奏時間をそれぞれ文字列にして記録
⑤残曲数及び"CLONE"の残り曲数を調べて、まだ残りがあるなら①へ戻る。残りがなければテキストファイルに記録を出力して終了。

(4)結果サマリー処理
(3)で出力したファイルを読み込んで以下の観点の集計を行う。
CLONEは全部で3曲あるので、同様の集計を1つ目・2つ目・3つ目のCLONEそれぞれに対して行う。
①平均:CLONEが選択されたときの曲順及びそこまでの演奏時間の平均値
②最大:CLONEが選択されたときの曲順及びそこまでの演奏時間の最大値
③最小:CLONEが選択されたときの曲順及びそこまでの演奏時間の最小値
集計した結果はテキストファイルで出力する。


(3)の結果は当初メモリ内でやりくりするつもりだったが、
やはり家庭用のパソコンでは不安があるので前回同様一時ファイルに出力するよう変更した。
(3)の結果は一時ファイルとしてローカルディスク上に出力されるので、
EXCELががんばれる範囲(旧式EXCELなら65535行)であれば開いて手元で集計も可能だ(つまり(4)不要)。
そういうのもあって(4)は後から付けたのだが、やはり10万回を超える試行の場合は手元じゃ難しいので、
ロジック組んで集計しておくことにした。
試行回数次第では現実的な時間に終わらない可能性もあるが、
ローカルディスクの空き容量が許す限り、10万回や100万回といった大きな試行回数でも耐えられるようになっている。

で、とりあえず10万回で試行してみる。
この結果、以下のようになった。

曲順記録(1)
平均:64
最大:251
最小:1
======================================================
演奏時間記録(1)
平均:03:58:13
最大:15:35:47
最小:00:00:00
======================================================
曲順記録(2)
平均:128
最大:255
最小:2
======================================================
演奏時間記録(2)
平均:08:01:43
最大:15:55:40
最小:00:05:38
======================================================
曲順記録(3)
平均:192
最大:256
最小:7
======================================================
演奏時間記録(3)
平均:12:03:55
最大:16:01:19
最小:00:25:16
======================================================

これは(4)の結果ファイルである。「曲順記録(1)」とかの(1)は「1つ目のCLONE」を指す。

興味深いのは1つ目のCLONEの結果である。
「平均して64曲目には選択される」というのが確認できる。
これは、このシミュレーションを実施する前に考えた
「1つ目のCLONEは少なくとも何曲目までに選ばれるのか?」の計算式によれば、約57.813%という位置に存在している。
統計的には、このポイントが「平均値」として表れてくるのだろうか?
(なんとなく、50%のポイント-上述した53曲目-がそこにあたるのだろうと思っていた)

また、1つ目のCLONEの演奏時間の平均でいえば、
1つ目のCLONEを聴くまで平均して03:58:13(3時間58分13秒)かかるということも確認できる。
最小(つまり最速)では1曲目からCLONEが選ばれているパターンがあるから、あくまで平均の観点であるが、
1つ目聴くまで約4時間もかかるのか……
一回の会社への出勤及び帰宅の時間が60分だとすると、
上記の「平均64曲目」というのを加味してもやはり「あんまり60分以内に出てくることはない」という結論になりそうである。

というか、よく見ると、1つ目のCLONEの平均曲順=64からたどると、
2つ目の平均曲順=128、3つ目の平均曲順=192でとなっていて、その差が全て64になっている。
偶然か…?
それとも俺が知らないだけで理論的な裏付けが何かあるのだろうか?(いや、きっとあるのだろう)

3つ目のCLONEは平均して192曲目に選択されており、そこまでの演奏時間の合計は平均で12:03:55、
まあ普通に聴いている分には、約12時間ぶっ続けで聴き続ければその中にCLONE3曲とも入ってるだろう、
という話になるようだ。



正直ここまでやった分には、
CLONEは俺が思うほど高い頻度で選ばれる曲ではないようにしか見えない。
なんとなく耳に残るからなのか。確率の法則以外に人間の心理的要素が作用してきているのか。
一度自分の聴いたリストを並べていったほうがいいかもしれない。
実際の経験とこのシミュレーション結果との対比を行い、改めて評価する。
やってみようかな。