Excel:扑克经销商

时间:2018-10-23 10:28:46

标签: excel vba excel-vba poker

我想使用Excel作为我的扑克经销商。这是将在1到52之间生成20个随机数(卡)的代码。前20个数字/卡的输出在A1:A20列中。我想在A22:A41,第三A43:A62等中生成下一组20个数字/卡。如何固定代码,使其在A列中显示1000手,每组分开一行?谢谢。

Sub cards()

Range("A:A").Clear

cardstodraw = 20

For x = 1 To cardstodraw

begL:
    ActiveSheet.Cells(1, 2) = "=Randbetween(1,52)"
    ActiveSheet.Cells(x, 1) = ActiveSheet.Cells(1, 2).Text
    cardvalue = ActiveSheet.Cells(x, 1)
        y = 1
        Count = 0
        Do Until ActiveSheet.Cells(y, 1) = ""
            If ActiveSheet.Cells(y, 1) = cardvalue Then
            Count = Count + 1
            End If:  y = y + 1:  Loop
            If Count > 1 Then GoTo begL

    Next

    Range("B1").Clear


End Sub

2 个答案:

答案 0 :(得分:1)

尝试:

Sub cards()
Dim cardstodraw  As Long, numberofhands As Long, i As Long, j As Long, k As Long
cardstodraw = 20
numberofhands = 50
Range("A:A").Clear
With Application.WorksheetFunction
    For j = 0 To numberofhands - 1
        For i = 1 To cardstodraw
begL:
        Cells(i + k + (j * cardstodraw), 1) = .RandBetween(1, 52)
        If .CountIf(Range(Cells(1 + k + (j * cardstodraw), 1), Cells(20 + k + (j * cardstodraw), 1)), Cells(i + k + (j * cardstodraw), 1)) > 1 Then GoTo begL
        Next i
        k = k + 1
    Next j
End With

End Sub

答案 1 :(得分:1)

您的代码有些复杂(使用GoTo通常表明可以改进某些地方)。要从1-52获取大小为20的样本,请使用修改后的Fisher-Yates shuffle

Option Explicit 'you really should be using this

Function deal(n As Long, k As Long) As Variant
    'returns an array of length k
    'consisting of k numbers in the range 1 to n

    Dim deck As Variant
    Dim i As Long, j As Long, temp As Long

    ReDim deck(1 To n)
    For i = 1 To n
        deck(i) = i
    Next i

    With Application.WorksheetFunction
        'do k steps of a Fisher-Yates shuffle on deck
        For i = 1 To .Min(k, n - 1)
            j = .RandBetween(i, n)
            If i < j Then 'swap
                temp = deck(i)
                deck(i) = deck(j)
                deck(j) = temp
            End If
        Next i
    End With

    ReDim Preserve deck(1 To k)
    deal = deck
End Function

如果您希望在A列中拥有1000手:

Sub ManyHands()
    Dim i As Long
    With Application.WorksheetFunction
        For i = 1 To 1000
            Range(Cells(1 + 21 * (i - 1), 1), Cells(21 * i - 1, 1)).Value = .Transpose(deal(52, 20))
        Next i
    End With   
End Sub

编辑时:这是该代码的修改版本,该代码可向多位玩家分发卡片:

Function deal(n As Long, k As Long, players As Long) As Variant
    'returns an array with k rows and players columns
    'consisting of k*players numbers in range 1 to n
    'if players = 1, then the array is 1-dimensional
    'otherwise it is 2-dimensional

    Dim deck As Variant
    Dim i As Long, j As Long, temp As Long
    Dim hands As Variant

    ReDim deck(1 To n)
    For i = 1 To n
        deck(i) = i
    Next i

    With Application.WorksheetFunction
        'do k*players steps of a Fisher-Yates shuffle on deck
        For i = 1 To .Min(k * players, n - 1)
            j = .RandBetween(i, n)
            If i < j Then 'swap
                temp = deck(i)
                deck(i) = deck(j)
                deck(j) = temp
            End If
        Next i
    End With

    ReDim Preserve deck(1 To k * players)
    If players = 1 Then
        deal = deck
        Exit Function
    Else
        ReDim hands(1 To k, 1 To players)
        For i = 1 To k
            For j = 1 To players
                hands(i, j) = deck(players * (i - 1) + j)
            Next j
        Next i
    deal = hands
    End If
End Function

它可以像这样使用:

Sub ManyHands()
    Dim i As Long
    For i = 1 To 1000
        Range(Cells(1 + 11 * (i - 1), 1), Cells(11 * i - 1, 2)).Value = deal(52, 10, 2)
    Next i  
End Sub