VB.NETでカードのデッキをシャッフルする方法を書く

私は52枚のカードの標準デッキを配列で表現しています。各カードは整数で表されます。私はカードをシャッフルするために以下の関数を書いた。下のコードは大丈夫ですか?

Module Module3

Sub Main()

    ' initialize array
    Dim Cards(52) As Integer

    ' Unit Test
    ' Pass array as argument.
    Console.WriteLine(shuffle(Cards))

End Sub

Function shuffle(ByVal Cards() As Integer)

    Dim counter = 1
    Dim rand = New Random()

    For Each card In Cards

        ' Grab random number with range of 52
        Dim n = rand.Next(52)

        ' Pick a card
        Dim temp = Cards(counter)

        ' Swap picked card with random card
        Cards(counter) = Cards(n)
        Cards(n) = temp

        counter += 1

    Next

    Return (Cards)

End Function

End Module
ベストアンサー

いいえ、コードはあなたの言うことをしません。

Dim Cards(52) As Integer

これにより、52枚ではなく53枚のカードの配列が作成されます。使用:

Dim Cards(51) As Integer

シャッフル時に、各カードをデッキ(またはそれ自身)の前のカードで交換します。デッキのどこにでも入れないでください。
(これはFisher-Yatesのシャッフルの原理です。)

ループとは別のカウンタを使用する代わりに、ループのカウンタを使用します。

Dim rand = New Random()

For counter = 0 to Cards.Length - 1

  Dim n = rand.Next(counter + 1)

  Dim temp = Cards(counter)
  Cards(counter) = Cards(n)
  Cards(n) = temp

Next

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です