LoginSignup
0
0

More than 1 year has passed since last update.

ショットガンシャッフルはN回やると元の状態に戻るぜ!

Posted at

ショットガンシャッフルはカードを痛めるぜ!!!

カードを痛めることで広く知られている通称ショットガンシャッフル、
正式名称リフルシャッフルはN回目のシャッフルでシャッフル前の状態に戻るそうです。
何回で元に戻るのか検証してみましょう。

52枚のトランプを痛める

それではやっていきましょう。
今回は52枚のトランプを使っていきます。

手順としては52枚のトランプを用意してショットガンシャッフルを行い、
元の状態に戻るまでシャッフルを続けて、その時のシャッフル回数を表示する方針となります。

元の状態に戻ったかどうかの判定ですが、頭のいい方法が思いつかない凡骨だったので
シャッフル前のデッキとシャッフルしているデッキ間の52枚全部についてそれぞれ繰り返しで比較しています。

無限ループに陥ってしまうと怖いので100回のシャッフルでループを抜けるようにしましたが、
結果それ以下の回数で試行が終了したのでコメントアウトしています。

ShotGunShuffle.py
import pandas as pd

vCards = []
for lSuits in ['H', 'S', 'C', 'D']:
    vCards.extend(str(lNum) + lSuits for lNum in list(range(1, 14)))

vOriginDeck = pd.DataFrame({'card': vCards, 'sort': list(range(0, 52))}, index=list(range(0, 52)))
vDeck = vOriginDeck

vCountShuffle = 0
vIsDeckOrigin = False

while vIsDeckOrigin == False:
    vCountShuffle += 1

    for i in list(range(0, 52)):
        if i < 26:
            vDeck.iat[i, 1] = i*2
        else:
            vDeck.iat[i, 1] = (i-25)*2-1

    vDeck = vDeck.sort_values('sort')
    vDeck.reset_index(drop=True, inplace=True)

    for i in list(range(0, 52)):
        vDeck.iat[i, 1] = i

    vIsDeckOrigin = True
    for i in list(range(0, 52)):
        if vOriginDeck.iat[i, 0] != vDeck.iat[i, 0]:
            vIsDeckOrigin = False
#    if vCountShuffle > 100:
#        vIsDeckOrigin = True

print(vCountShuffle)

結果
8

ショットガンシャッフルはN回やると元の状態に戻るぜ!(N=8)

おわり

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0