RM-BLOG

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

ストレイテナーと確率8(連続の確率)

なんかシャッフルで聴いていると
重複度が2以上の曲A(シングルとアルバムで2つ持ってるとか)があったとき、
あるタイミングでAが再生されるとその次かその次の次あたりでまたAが流れることが多いように感じる。
例えばストレイテナーと確率1ではSILLY PARADE(重複度2)の連続再生確率を計算したが、
その確率は約0.00367%という結果になっており、100000回(10万回)に3回くらいしか起きない。
この値からすれば「連続再生」はかなりレアだと思うのだがどうも聴いているとよくこういう現象にあたる気がしてきた。
「直近で聴いたことあるから耳に残ってる」ということで印象に強く残るのかもしれないが、
そもそも連続再生に対する遭遇率が低いんだし、現象が発生しなければ印象に残るもくそもないと思うのだ。

SILLY PARADEは重複度2なので、1曲どこかで再生されると残りは1曲となり、
それがしかも連続するとなるとかなり低確率であることは計算するまでもなく感じ取れるが、
ストレイテナーと確率5で確認した結果では手持ちのストレイテナーには重複度3の曲(CLONE等)もあり、
こっちの連続再生はSILLY PARADEに比べれば少し高い感じもする。
また、冒頭述べたように、「連続」でなくても、
CLONE⇒(なんか別の曲)⇒CLONEというように間に1~2曲挟むパターンにもよく遭遇する印象がある。
こういったパターンも加味して、今回は「連続の確率」というのに着目してみたい。


 

 
n曲目から連続再生する場合は、重複度3だと

 n-1曲目まで3つを除くどれかが選ばれ続ける確率
×n曲目に残りの曲から3つのどれかが選ばれる確率
×n+1曲目に残りの曲から2つのどれかが選ばれる確率
×n+2曲目に残りの曲から1つ(のどれか)が選ばれる確率

になるわけだから

 (254Pn-1/257Pn-1) * 3/(257-n+1) * 2/(257-n) * 1/(257-n-1)

ストレイテナーと確率3から拝借

一般に重複度mにおいて


 (257-mPn-1/257Pn-1) * m/(257-n+1) * (m-1)/(257-n)* … * 1/(257-n+1-(m-1))
  = (257-mPn-1/257Pn-1) * m/(257-n+1) * (m-1)/(257-n)* … * 1/(257-n-m+2)


ところで下線部分はまとめられるから

 (257-mPn-1/257Pn-1) * m!/257-n+1Pm

って感じかな。

ちなみにこれによればストレイテナーと確率1における「SILLY PARADEが24曲目から連続再生」は、0.00304%となる。
ストレイテナーと確率1」では”直前までSILLY PARADEが流れていない”を加味していなかったので冒頭の確率で計算されたが
実際、それを加味するとこの値になるようだ。



ところでこれに「途中k曲挟む」というのを加味するとどうなるのだろうか?
例えば重複度2の曲において、n曲目及びN曲目(N>n)にその曲が再生される確率は

 n-1曲目まで2つを除くどれかが選ばれ続ける確率
×n曲目に残りの曲から2つのどれかが選ばれる確率
×n+1~N-1曲目まで残りの1曲を除くどれかが選ばれる確率
×N曲目に残りの曲から1つ(のどれか)が選ばれる確率

となる。

……こういうのは簡単な例を考えてみたほうがいいので
例えば重複度2の曲が4曲目と7曲目に再生されるとすると

 255/257*254/256*253/255*2/254*252/253*251/252*1/251
 =(255P3/257P3)*2/254*(252P2/253P2)*1/251

だから

 (255Pn-1/257Pn-1) * 2/(257-n+1) * (255-n+1PN-n-1/257-nPN-n-1) * 1/(257-N+1)

このとき、n曲目とN曲目の間がk曲(間にk曲挟む)だとすると、N=n+k+1になるので

 (255Pn-1/257Pn-1) * 2/(257-n+1) * (255-n+1Pk/257-nPk) * 1/(257-n-k)


という感じ。



さらに重複度3に話を広げると、
n1,n2,n3曲目にそれぞれ再生されて、n1とn2の間にk1曲、n2とn3の間にk2曲挟むとすると

 (254Pn1-1/257Pn1-1) * 3/(257-n1+1)
  * (255-n1+1Pk1/257-n1Pk1) * 2/(257-n1-k1)
  * (256-n2+1Pk2/257-n2Pk2) * 1/(257-n2-k2)


って感じになるようである。

より一般には、
重複度mの曲(括りとしてはアルバムでもいい)がn1、n2、n3…nr曲目に再生され、
n1とn2の間にk1曲挟み、n2とn3の間にk2曲挟み、…nrとnr+1の間にkr曲挟むとすると、

 (257-mPn1-1/257Pn1-1) * m/(257-n1+1)
  * (257-m-n1+1Pk1/257-n1Pk1) * (m-1)/(257-n1-k1)
  * (257-m-n2+2Pk2/257-n2Pk2) * (m-2)/(257-n2-k2)
  * …
  * (257-m-nr+r-1Pkr/257-nrPkr) * (m-r+1)/(257-nr-kr)
  * …


krが0のときはxPkrは1になるから、
これは「間髪入れずに連続する」の確率計算式の一般化形態といれる。
しかしなんかもう見づらいな……
EXCELに打つ気はもうない…試算用プログラムはjavaで自作したほうがよさそうだな……



というわけで自作した。

引数にスペース区切りでn1,n2,n3…nrを指定すると、
それぞれの曲順で選択される確率p1,p2,p3…prを計算して標準出力するプログラムである。
計算対象の曲(ないしアルバム)の重複度は渡した引数のlengthから取得するので指定不要だが、
逆に言うと重複度3なら3つ指定しないと重複度3として計算してくれない。
つまり、「重複度3の2つ目が128曲目に選択される確率が知りたい、3つ目はどうでもいい」という場合でも

java CalculateForStraightenerSimulation 10 128 257

のように、3つ目はとりあえず指定する必要がある。

これによれば、「ストレイテナーと確率1」の”SILLY PARADEが24曲目と25曲目に連続”する確率は

2014/11/12 11:03:59.857 1.引数チェック
2014/11/12 11:03:59.857 2.メイン計算処理
2014/11/12 11:03:59.857 計算終了:結果表示
2014/11/12 11:03:59.857 =============================================
2014/11/12 11:03:59.857 1番目の曲順:24 の選択確率=0.0070829280
2014/11/12 11:03:59.857 2番目の曲順:25 の選択確率=0.0000303988

となって、"2番目の曲順:25 の選択確率=0.0000303988"の部分は上述した計算式の結果と一致する(四捨五入して0.0000304=0.00304%)。



これを用いていくつかのパターンを検証してみる。
例えばCLONE等の重複度3の曲が間髪入れずに連続する(上の計算式でいうとkrが全部0)場合

曲順結果

1

2

3
1番目の曲順:1 の選択確率=0.0116731518
2番目の曲順:2 の選択確率=0.0000911965
3番目の曲順:3 の選択確率=0.0000003576
100

101

102
1番目の曲順:100 の選択確率=0.0043795777
2番目の曲順:101 の選択確率=0.0000557908
3番目の曲順:102 の選択確率=0.0000003576
200

201

202
1番目の曲順:200 の選択確率=0.0005707828
2番目の曲順:201 の選択確率=0.0000200275
3番目の曲順:202 の選択確率=0.0000003576



間にk曲挟んでみよう。
上記の例にk=2を加えると。

曲順結果

1

3

5
1番目の曲順:1 の選択確率=0.0116731518
2番目の曲順:3 の選択確率=0.0000908389
3番目の曲順:5 の選択確率=0.0000003576
100

102

104
1番目の曲順:100 の選択確率=0.0043795777
2番目の曲順:102 の選択確率=0.0000554332
3番目の曲順:104 の選択確率=0.0000003576
200

202

204
1番目の曲順:200 の選択確率=0.0005707828
2番目の曲順:202 の選択確率=0.0000196698
3番目の曲順:204 の選択確率=0.0000003576



…ん?
kを100にしてみると。

曲順結果

1

101

201
1番目の曲順:1 の選択確率=0.0116731518
2番目の曲順:101 の選択確率=0.0000557908
3番目の曲順:201 の選択確率=0.0000003576


…3つ目の曲が選ばれる曲順が3曲目だろうと102曲目だろうと202曲目だろうと変わらず「0.0000003576」である。
自作したプログラムがなんかバグってんのかなと思ったが、よく考えたらこれが正しいようだ。

これは、途中がどうであろうと、3つ目の曲がどこで選ばれるかによって計算が行われるからだ。
3つ目の曲がn曲目に選ばれる場合、

 (254Pn-3*m!)/257Pn

というかより一般的には、重複度mのとき

 (257-mPn-m*m!)/257Pn

になる。

これは途中でk曲挟む挟まないの有無に関わらず同じ。
簡単な例でいうと

■全10曲のうち3曲重複している曲が1、7、10曲目に選ばれる場合

曲順選択される
曲順かどうか選択確率

1 3/10
2   7/9
3   6/8
4   5/7
5   4/6
6   3/5
7 2/4
8   2/3
9   1/2
10 1/1


⇒3/10*7/9*6/8*5/7*4/6*3/5*2/4*2/3*1/2≒0.00833…

■全10曲のうち3曲重複している曲が1、2、3曲目に選ばれる場合

曲順選択される
曲順かどうか選択確率

1 3/10
2 2/9
3 1/8
4   7/7=1
5   6/6=1
6   5/5=1
7   4/4=1
8   3/3=1
9   2/2=1
10   1/1=1


⇒3/10×2/9×1/8≒0.00833…
※この例は確率判定対象の曲が最初の3曲で出尽くしてしまうので、4曲目以降は何が来てもよい(4曲目の時点で3曲全部聴き終わってる=100%)。

計算の過程は違うが結果的に上に書いた計算式で一般化されている。

というか、つまりは、nが重複度mより大きい場合の一般式として↑に書いた計算式で計算してもいいが、
わざわざ計算するなら(どうせ答え同じなんだし)もっとも簡単な”全10曲のうち3曲重複している曲が1、2、3曲目に選ばれる場合”を使ったほうが手っ取り早いということか。
だから極論言うと何曲目に選ばれるかなんて関係なく(つまり3つ目の曲が選ばれる曲順nに寄らず)
重複度がmならm個目の曲が選ばれる確率はどの曲順だろうが等しく

 m!/257Pm

で計算できてしまう。
ここまでたどり着くのに時間かかりすぎ…(・ω・`)



理論的には、上述した「間髪入れずに連続」の計算式

 (257-mPn-1/257Pn-1) * m!/257-n+1Pm

を展開していくと同じ結果にたどりつけそうである。

n=mのときには

   (257-nPn-1/257Pn-1) * n!/257-n+1Pn
 
  = (257-n)(257-n-1)…(257-n-(n-1-1))/(257)(257-1)…(257-(n-1-1))
 
   * n!/(257-n+1)(257-n)(257-n-1)…(257-n+1-(n-1))
 
  = (257-n)(257-n-1)…(257-2n-2)/(257)(257-1)…(257-n+2)
 
   * n!/(257-n+1)(257-n)(257-n-1)…(257-2n-2)
 

枠線部分が一致してるので約分できるから

   1/(257)(257-1)…(257-n+2) * n! / (257-n+1)
 
  = n! / 257Pn
 

となって↑の式と一致。



n>mのときには、257-m>257-nだから、257-mから1ずつ下って行けば257-nになるポイントがどこかにある、ということだから、

(257-mPn-1/257Pn-1) * m!/257-n+1Pm
 
= (257-m)(257-m-1)…(257-m-(n-1)+1)/{(257)(257-1)…(257-(n-1)+1) }
 
          * m! / (257-n+1)(257-n)…(257-n+1-m+1)
 
= (257-m)(257-m-1)…(257-n+1)(257-n)…(257-m-n+2)/{(257)(257-1)…(257-n+2) }
 
          * m! / (257-n+1)(257-n)…(257-n-m+2)
 

枠線部分を約分して

   (257-m)(257-m-1)…(257-n+1)/{(257)(257-1)…(257-n+2) } * m! / (257-n+1)
 
= (257-m)(257-m-1)…(257-m+m-n+1) * m! / [{(257)(257-1)…(257-n+2) } * (257-n+1)]
 
= (257-mPn-m * m!) / 257Pn


となって同じ計算式が導かれる。



n=mはともかく、n>mのケースは

 (257-mPn-1/257Pn-1) * m!/257-n+1Pm

を単に式変形しただけで同じ意味だな。



途中、自己満足のミニ数学議論が入ってしまったが、まとめると…
●重複度mの曲があるタイミングで再生されたとき、m個目の曲が再生される確率は(257-mPn-m * m!)/ 257Pnで計算される。
●重複度mの曲の1つ目、2つ目、…m-1つ目の間に何曲を挟んでも、m個目の曲が再生される確率は同じ。
 つまり、「間髪入れずに連続再生」しようが「間に何曲か挟んで再生」しようが最後の(m個目の)曲が選ばれる確率は同じ。
●このため、重複度mの曲のm個目の曲が再生される確率は、1曲目からm曲目まで順に連続で選ばれる確率と等しい。
 よって、重複度mの曲のm個目の曲が選ばれる確率は、どの曲順だろうと等しくm!/257Pmで計算される。

「連続再生の確率はそれほど高くないんじゃないか」という冒頭の疑問に関しては、
確かに数値的な評価でいうとその通りという結果になるが、
間に何曲か挟む確率も確率的には同値であるから、
間髪入れずに連続するケースを含めると結構起きてるんじゃないかとは感じた。
人間が心理的に感じる「あ、またこの曲か」の感覚が、
どの程度の時間的感覚まで及ぶのかによって、確率は変わってくるという結論になる。
少なくとも「間髪入れずに連続」「間に何曲か挟んで連続」の2パターンでは、確率は一致するということが
本項で確認できたのは個人的には大きい成果だと感じる。
実験的結果(プログラムの実装)と理論的結果(上の「ミニ数学議論」)が一致したのにも個人的に満足いく結果である。

しかしここには「1曲目から」というのが前提に入ってしまっている。
「連続」の考え方には、ある曲が再生された時点でその後にまたその曲が選ばれるというのが一般的な感覚としてあると思う。
時間があるなら、今度はここを深堀していきたい。