カードゲームをやったことがある人なら分かると思うのですが,デッキのシャッフルの仕方にはいろんな方法があるものです.
そして,その中でも特に(カードゲームプレイヤに)よく使われるのがディールシャッフルだと思います.
ディールシャッフル(7枚切り)
ディールシャッフルはデッキをいくつかの山に順番に分配した後,また一つにまとめるというものです.(よくわからない人はwiki参照)
7つの山に分けるディールシャッフルを7枚切り,6つなら6枚切りなんていったりします.
通常,ヒンズーシャッフル(普通のシャッフル)と同時に2,3回ディールシャッフルを行いますが,この時のディールシャッフルの仕方には人によっていろんな流儀があったりします.
僕のまわりでは7枚切り,5枚切り,3枚切りの順に行う「素数切り」や7,6,5の順に行う「ナムコ切り」なんかがいました.(ちなみに僕は765切り派です)ほかにも654切り,876切りなどいろんな人がいたのですが,結局どの切り方が最もランダムにデッキを混ぜることができるのか気になったので検証してみました.
※ヒンズーシャッフルは定義が難しかったので,ディールシャッフルのみを対象にして計算しました.
まず,デッキを60枚とし,初期状態をc[60] = { 0, 1, 2, … , 59 }という配列で表します.
その後,ディールシャッフルを行った状態を前の状態から生成します.例えば4枚切りならc[60] = { 0, 4, 8, … }といった具合です.
あとはランダム差を評価するだけですが,評価は以下の式で行いました.
前後5枚のカード番号と自身のカード番号の差の絶対値の総和をとっています.たぶん順番にカードが並んでいる時が最小で,ある程度ランダムなほど数値が大きくなると思います.
本当は,もっと適切な式を用意したかったのですがランダムさの評価はなんだかとっても難しかったので,とりあえず簡単な式を使って見ました.
そんなこんなで計算結果は以下のようになりました.
初期状態:3380
343番,543切り:3380
342番,453切り:3380
341番,345切り:3380
…
5番,866切り:14032
4番,367切り:14172
3番,637切り:14172
2番,798切り:14316
1番,555切り:14420
デッキ枚数に対して素な数で切った方が良いと思っていたのですが,なんと555切りが最もランダムという結果となりました.
が,ちょっとあやしいですね.ランダムさの評価式による特性が影響しているように思うのですが…
その他の切り方に関しては
127番,876切り:12712
161番,765切り:12536
262番,753切り:11912
336番,654切り:6320
となりました.
これだけじゃつまらないのでついでに可視化してみました.
カード番号0を輝度0, カード番号59を輝度1として画像にして見ました.
初期状態:
555切り:
798切り:
637切り:
876切り:
765切り:
753切り:
やっぱり,555切りは規則的な並びになってるようです.パッと見た感じでは876切りが良い感じでしょうか?
検証の結果,555切り,798切り,637切りなどが高評価になりましたが,評価関数をもう少し選びなおす必要がありそうです.
もっと良い評価関数を知ってる人はぜひ,教えてください.
追記
風呂に入りながらのんびり考えてみたら,ランダムさじゃなくて均一に混ざっているかという観点でいえば,今回の評価関数でも問題ない気がしてきました.
ただ,555切りは均一すぎて積み込みを疑われかねないレベルなので,ヒンズーシャッフルを織りまぜながら使ったほうがいいと思います.