私は小規模なポーカー プログラムを行っており、デッキがどれだけうまくシャッフルされているかを判断したいと考えています。52 枚のカードを含むリストがあり、シャッフル アルゴリズムを実行して、デッキがある程度の規模でシャッフルされているかどうかを判断できるようにしたいと考えています。誰かがこれを行う方法を知っていますか? ありがとう
編集:うわー。たくさんの反応。すべて良いですが、まさに私が探していたものではありません。それは、私の質問をこれ以上特定しなかった私のせいです。でも、サランは私が実際に望んでいるものに最も近いと思います. 指定させてください。
すぐに「完璧な」シャッフルはしたくありません。私はすでにそれを読み、Fisher-Yatesを実装しました。それは「完璧な」シャッフルをするのが得意です。私がやろうとしているのは、友人がテキサス ホールデムをプレイしている現実世界の状況をシミュレートすることです。ディーラーはデッキを取り、他のシャッフルと混合したリフル シャッフルを使用してシャッフルします。最後に、私が欲しいのは、現実世界のシャッフルの違いを測定する方法です。
例。デッキは常に新鮮であると仮定します (エースからキングのスーテッド、次に 4 つのスーツすべての次のスーツのエースからキング)。ジョーはデックを取り、間に 1 つのカットを入れて 2 つのリフル シャッフルを行います。ピーターはストリッピング シャッフルを 5 回行います。どちらがデッキを「より良く」シャッフルするかを確認する方法を見つけたい.
考えれば考えるほど、決定するのは非常に難しいと思います。
再度、感謝します。
編集 23.10.2013
サランのアイデアと私のアイデアを組み合わせて、私が思いついた方法は次のとおりです。
public int checkShuffle(List<Card> cardDeckToCheck,int[] previousOrder)
{
// Higher is worse? Sure.
int score = 0;
for (int i = 0; i < cardDeckToCheck.Count; i++)
{
Card cardToCheck = cardDeckToCheck[i];
Card cardToLeft = null;
Card cardToRight = null;
// Should cost more since the card has not moved at all.
// For this I need an array that shows me the arangement of the deck before shuffling.
if(cardToCheck.index == previousOrder[i])
{
score += 3;
}
if (i == 0)
{
Console.WriteLine("i == 1");
cardToRight = cardDeckToCheck[i+1];
// if the card we are checking is one lower or one higher than the card to the right
if(Math.Abs(cardToCheck.index - cardToRight.index) == 1)
{
score++;
}
continue;
}
else if (i == cardDeckToCheck.Count-1)
{
Console.WriteLine("i == carddecktocheck.count-1");
cardToLeft = cardDeckToCheck[i - 1];
// if the card we are checking is one lower or one higher than
if (Math.Abs(cardToCheck.index - cardToLeft.index) == 1)
{
score++;
}
continue;
}
else
{
cardToLeft = cardDeckToCheck[i - 1];
cardToRight = cardDeckToCheck[i + 1];
// if the card we are checking is one lower or one higher than
if (Math.Abs(cardToCheck.index - cardToLeft.index) == 1)
{
score++;
}
if (Math.Abs(cardToCheck.index - cardToRight.index) == 1)
{
score++;
}
continue;
}
}
return score;
}
最初にデッキがどのように見えるかを int 配列に記録し、次にデッキをシャッフルしてから、シャッフルされたデッキとデッキの前の順序でこのメソッドを実行します。そのようです:
int[] previousOrder = getCurrentOrder(deck.getDeck());
deck.setDeck(riffleShuffle2(3));
textBoxShuffleness.Text = "" + checkShuffle(deck.getDeck(), previousOrder);
displayDeck(deck);
シャッフルされていないデッキから始めて、リフル シャッフル メソッドを 5 回実行すると、70、33、28、5、10 が得られます。シャッフルされていないデッキから始めて、ダーステンフェルド シャッフル メソッドを 5 回実行すると、5,0,7,11,7 が得られます。
これらの結果は、私が期待するものです。
誰かがこの方法で何か問題を見つけた場合は、コメントしていただければ幸いです:)ありがとう