配列を所定の位置にシャッフルするための Fisher-Yates アルゴリズムを再現しようとしています。
問題は、「素朴な」シャッフルの最初のステップを実行すると、結果が非常に均一になることです。一部の組み合わせでは予想されるスキューが見られません。最大 600 万回の試行を実行しました。
- 123 --> 999,472 (16.7%)
- 132 --> 999,588 (16.7%)
- 213 --> 1,000,883 (16.7%)
- 231 --> 1,001,306 (16.7%)
- 312 --> 999,702 (16.7%)
- 321 --> 999,049 (16.7%)
- TOT --> 6,000,000 (100.0%)
私の実装には何か「問題」があると思われますので、フィードバックをいただければ幸いです。
私が使用しているコードは次のとおりです。
import random
from pprint import pprint
runLength = 600000
cards = [1, 2, 3]
sequenceCount = {'123':0, '132':0, '213':0, '231':0, '312':0, '321':0}
for k in range(runLength):
# naive shuffle
for i,v in enumerate(cards):
n = random.randint(0, len(cards)-1)
cards[i], cards[n] = cards[n], cards[i] #swap
# track results
strDeck = ''
for j,v in enumerate(cards):
strDeck = strDeck + str(cards[j])
sequenceCount[strDeck] = sequenceCount[strDeck] + 1
# results summary
pprint(sequenceCount)