vba - 如何使用 VBA 生成 52 张牌的所有 4 种牌组合?

标签 vba excel combinatorics

我正在尝试使用一副 52 张卡片生成 4 张卡片的所有组合。生成所有排列很容易(而且很长),但在卡片中,顺序并不重要,因此例如 Ah,Kh,Qh,Jh 将与 Kh,Ah,Qh,Jh 相同。谁能指出我正确的方向或向我展示一些我可以使用的示例代码?觉得很奇怪,以前没有人尝试过这个。

最佳答案

使用 4 个嵌套循环。为了防止重复并仅计算“唯一集”,我认为您只需让每个循环从以下位置开始:[“父”循环的当前值] + 1


代码如下:

Option Explicit

Sub All4Combos()

    'Caution!  Save your work before runnning! (or set constant smaller)

    Const NumCardsInDeck = 52
    Dim c1, c2, c3, c4
    Dim p As Long

    For c1 = 1 To NumCardsInDeck
        For c2 = c1 + 1 To NumCardsInDeck
            For c3 = c2 + 1 To NumCardsInDeck
               For c4 = c3 + 1 To NumCardsInDeck

                    p = p + 1
                    Debug.Print c1, c2, c3, c4

                Next c4
            Next c3
        Next c2
    Next c1

    Debug.Print p & " Combinations of " & NumCardsInDeck & " cards"

End Sub

结果:

排列数:

52 x 51 x 50 x 49

组合数量:

Permuations / slots!
--OR--
(52 x 51 x 50 x 49) / (4 x 3 x 2 x 1)

结果是 270725 个组合。

这是包含 10 张卡片的结果集:

1,2,4,10
1,2,5,6
1,2,5,7
1,2,5,8
1,2,5,9
1,2,5,10
1,2,6,7
1,2,6,8
1,2,6,9
1,2,6,10
1,2,7,8
1,2,7,9
1,2,7,10
1,2,8,9
1,2,8,10
1,2,9,10
1,3,4,5
1,3,4,6
1,3,4,7
1,3,4,8
1,3,4,9
1,3,4,10
1,3,5,6
1,3,5,7
1,3,5,8
1,3,5,9
1,3,5,10
1,3,6,7
1,3,6,8
1,3,6,9
1,3,6,10
1,3,7,8
1,3,7,9
1,3,7,10
1,3,8,9
1,3,8,10
1,3,9,10
1,4,5,6
1,4,5,7
1,4,5,8
1,4,5,9
1,4,5,10
1,4,6,7
1,4,6,8
1,4,6,9
1,4,6,10
1,4,7,8
1,4,7,9
1,4,7,10
1,4,8,9
1,4,8,10
1,4,9,10
1,5,6,7
1,5,6,8
1,5,6,9
1,5,6,10
1,5,7,8
1,5,7,9
1,5,7,10
1,5,8,9
1,5,8,10
1,5,9,10
1,6,7,8
1,6,7,9
1,6,7,10
1,6,8,9
1,6,8,10
1,6,9,10
1,7,8,9
1,7,8,10
1,7,9,10
1,8,9,10
2,3,4,5
2,3,4,6
2,3,4,7
2,3,4,8
2,3,4,9
2,3,4,10
2,3,5,6
2,3,5,7
2,3,5,8
2,3,5,9
2,3,5,10
2,3,6,7
2,3,6,8
2,3,6,9
2,3,6,10
2,3,7,8
2,3,7,9
2,3,7,10
2,3,8,9
2,3,8,10
2,3,9,10
2,4,5,6
2,4,5,7
2,4,5,8
2,4,5,9
2,4,5,10
2,4,6,7
2,4,6,8
2,4,6,9
2,4,6,10
2,4,7,8
2,4,7,9
2,4,7,10
2,4,8,9
2,4,8,10
2,4,9,10
2,5,6,7
2,5,6,8
2,5,6,9
2,5,6,10
2,5,7,8
2,5,7,9
2,5,7,10
2,5,8,9
2,5,8,10
2,5,9,10
2,6,7,8
2,6,7,9
2,6,7,10
2,6,8,9
2,6,8,10
2,6,9,10
2,7,8,9
2,7,8,10
2,7,9,10
2,8,9,10
3,4,5,6
3,4,5,7
3,4,5,8
3,4,5,9
3,4,5,10
3,4,6,7
3,4,6,8
3,4,6,9
3,4,6,10
3,4,7,8
3,4,7,9
3,4,7,10
3,4,8,9
3,4,8,10
3,4,9,10
3,5,6,7
3,5,6,8
3,5,6,9
3,5,6,10
3,5,7,8
3,5,7,9
3,5,7,10
3,5,8,9
3,5,8,10
3,5,9,10
3,6,7,8
3,6,7,9
3,6,7,10
3,6,8,9
3,6,8,10
3,6,9,10
3,7,8,9
3,7,8,10
3,7,9,10
3,8,9,10
4,5,6,7
4,5,6,8
4,5,6,9
4,5,6,10
4,5,7,8
4,5,7,9
4,5,7,10
4,5,8,9
4,5,8,10
4,5,9,10
4,6,7,8
4,6,7,9
4,6,7,10
4,6,8,9
4,6,8,10
4,6,9,10
4,7,8,9
4,7,8,10
4,7,9,10
4,8,9,10
5,6,7,8
5,6,7,9
5,6,7,10
5,6,8,9
5,6,8,10
5,6,9,10
5,7,8,9
5,7,8,10
5,7,9,10
5,8,9,10
6,7,8,9
6,7,8,10
6,7,9,10
6,8,9,10
7,8,9,10
210 Combinations of 10 cards

关于vba - 如何使用 VBA 生成 52 张牌的所有 4 种牌组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48882881/

相关文章:

vba - Excel宏: Modifying formula and appending segment

c# - 将 Excel 文件导入 DataGridView

vba - 错误 440 : Method 'Create' of object 'PivotCaches' failed

algorithm - Code Golf :生成帕斯卡三角形

vba - 两个数字之间的随机数 "gaps"

vba - 在 Excel VBA 中获取登录用户名 - 不是运行 Excel 的帐户(使用 RunAs)

vba - 需要根据Excel VBA中当前单元格中的单元格值删除Excel工作表中的上一行

c# - 来自一组 n 算法的 k 个对象的排列

python - 创建值集中排序数组的所有组合

python - xlwings Charts API 实现中未定义“xlCategory”和 'xlValue'