鍋あり谷あり

テーマを決めずに適当に書いています。

シャッフル再生の続き

コメントありがとうございます>jmuk様
で。
#今日は、たびたび文体が変わる。なんか変だが。
iTunes のパーティーシャッフル。私は、シャッフルとは名ばかりで実は重複を許す繰り返し試行に違いないと思っていた。シャッフルだと、X曲のライブラリからパーティーシャッフルすると、n*X曲目とn*X+1曲目に、乱数の継ぎ目ができてしまい、なんとなく不自然になるように思えたからだ。
それで昨日のような計算になったんだが、jmuk さんのコメントを読み、どちらなのか調べてみることにした。合計5曲のライブラリをつくり、パーティーシャッフルを作成してみると、最初の10曲は例えば次のようになる:

2 3 1 3 5 - 5 4 3 2 1 - 2 3 5 4 1
2 4 1 3 5 - 5 4 3 2 1 - 2 3 5 4 1*1

見やすいように、5曲ごとにハイフンを挟んでみた。
見事にシャッフルされていて、見事に5曲と6曲、10曲目と11曲目の継ぎ目が不自然になっている。十数回試してみたが、5曲ごとのブロックないに重複はなく、ブロックとブロックの境目は不自然につながっているということで間違いなさそうである。
というわけで、昨日の計算は正しくないのであった。

というわけで、シャッフルの場合の計算も書いておこう。
面倒なので確率だけ。しかも、ruby の式。選ぶ曲数が rep の場合の式は次の通り:

N = 300
(0...4).inject(1.0){ |r,i| 
  r*10.0*(N-i)/(10.0*N-i)
} * (0...rep-4).inject(1.0){ |r,i| 
  r*( 10.0*(N-4)-i ) / ( 10.0*N - (i+4))
}

合ってる?
計算結果は
 10曲 → 0.91
 100曲 → 0.30
 300曲 → 0.023
 1000曲 → 4.2e-7
となった。こんなもんか。
あ。そうそう。コメントを読んだらわかりました。はい。
しかし。jmuk さんの設定した問題は難しい。何を計算していいものやら。

それと。
昔、クイズゲームを作ったとき、前述の継ぎ目がすごく気になって、対策した憶えがある。
具体的なアルゴリズムは憶えてないが、例えば以下のような方法で継ぎ目をなくすことができる:

  1. 用意した問題の数は N。
  2. 直前の (N/2)問に含まれない問題からランダムに出題する。

これで、同じ問題/曲が続けて出題/再生される可能性はなくなる。
パーティーシャッフルはソースを指定できるので、対象となる曲の数が少なくなることも多いはず。これくらいの対策はしておいた方がいいと思う。

*1:最初のブロックに 3 がふたつあったのは、写し間違いである。とほほ。