指定奇偶数量的数字组合计算与批量生成技术咨询
彩票组合计算与批量生成方案
一、符合条件的组合数计算
1. 范围1-25选15(8奇7偶)
1-25中包含13个奇数(1、3、…、25)和12个偶数(2、4、…、24)。符合要求的组合数为从13个奇数中选8个的组合数乘以从12个偶数中选7个的组合数:C(13,8) * C(12,7) = 1287 * 792 = 1019304
即共有1019304种有效组合。
2. 范围缩小至20个数字(以1-20为例,8奇7偶)
1-20中包含10个奇数和10个偶数。符合要求的组合数为:C(10,8) * C(10,7) = 45 * 120 = 5400
即共有5400种有效组合。
二、Python批量生成代码
1. 1-25范围生成8奇7偶的15位组合
import itertools # 定义1-25的奇数、偶数列表 odds = list(range(1, 26, 2)) evens = list(range(2, 25, 2)) valid_combinations = [] # 遍历所有8奇+7偶的组合 for odd_group in itertools.combinations(odds, 8): for even_group in itertools.combinations(evens, 7): # 合并后排序(可选,方便统一格式查看) full_comb = sorted(odd_group + even_group) valid_combinations.append(full_comb) # 将结果写入文本文件 with open("lottery_25_combinations.txt", "w", encoding="utf-8") as f: for comb in valid_combinations: f.write(" ".join(map(str, comb)) + "\n") print(f"共生成{len(valid_combinations)}种组合,已保存到lottery_25_combinations.txt")
2. 1-20范围生成8奇7偶的15位组合
import itertools # 定义1-20的奇数、偶数列表 odds = list(range(1, 21, 2)) evens = list(range(2, 21, 2)) valid_combinations = [] for odd_group in itertools.combinations(odds, 8): for even_group in itertools.combinations(evens, 7): full_comb = sorted(odd_group + even_group) valid_combinations.append(full_comb) # 写入文件 with open("lottery_20_combinations.txt", "w", encoding="utf-8") as f: for comb in valid_combinations: f.write(" ".join(map(str, comb)) + "\n") print(f"共生成{len(valid_combinations)}种组合,已保存到lottery_20_combinations.txt")
三、VBA批量生成代码
1. 1-25范围生成8奇7偶的15位组合
Sub GenerateLottery_25() Dim odds As Variant, evens As Variant Dim oddCombs As Variant, evenCombs As Variant Dim i As Long, j As Long, rowNum As Long Dim fullComb As String ' 初始化1-25的奇数、偶数数组 odds = Array(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25) evens = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24) rowNum = 1 ' 获取所有8个奇数的组合、7个偶数的组合 oddCombs = GetCombinations(odds, 8) evenCombs = GetCombinations(evens, 7) ' 遍历组合并写入Excel工作表 For i = LBound(oddCombs) To UBound(oddCombs) For j = LBound(evenCombs) To UBound(evenCombs) fullComb = Join(SortArray(oddCombs(i) & evenCombs(j)), " ") Cells(rowNum, 1).Value = fullComb rowNum = rowNum + 1 Next j Next i MsgBox "生成完成,共" & (UBound(oddCombs) - LBound(oddCombs) + 1) * (UBound(evenCombs) - LBound(evenCombs) + 1) & "种组合" End Sub ' 辅助函数:生成指定长度的组合 Function GetCombinations(arr As Variant, k As Integer) As Variant Dim result As Collection Dim temp() As Variant Set result = New Collection ReDim temp(1 To k) Combine arr, LBound(arr), UBound(arr), 1, k, temp, result ' 将集合转换为数组返回 Dim output() As Variant ReDim output(1 To result.Count) For i = 1 To result.Count output(i) = result(i) Next i GetCombinations = output End Function Sub Combine(arr As Variant, start As Integer, endNum As Integer, index As Integer, k As Integer, temp As Variant, result As Collection) Dim i As Integer If index > k Then result.Add temp Exit Sub End If For i = start To endNum - (k - index) temp(index) = arr(i) Combine arr, i + 1, endNum, index + 1, k, temp, result Next i End Sub ' 辅助函数:对数组进行升序排序 Function SortArray(arr As Variant) As Variant Dim i As Long, j As Long, temp As Variant For i = LBound(arr) To UBound(arr) - 1 For j = i + 1 To UBound(arr) If arr(i) > arr(j) Then temp = arr(i) arr(i) = arr(j) arr(j) = temp End If Next j Next i SortArray = arr End Function
2. 1-20范围生成8奇7偶的15位组合
仅需修改初始化的奇数、偶数数组,其余辅助函数可复用:
Sub GenerateLottery_20() Dim odds As Variant, evens As Variant Dim oddCombs As Variant, evenCombs As Variant Dim i As Long, j As Long, rowNum As Long Dim fullComb As String ' 初始化1-20的奇数、偶数数组 odds = Array(1, 3, 5, 7, 9, 11, 13, 15, 17, 19) evens = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20) rowNum = 1 oddCombs = GetCombinations(odds, 8) evenCombs = GetCombinations(evens, 7) For i = LBound(oddCombs) To UBound(oddCombs) For j = LBound(evenCombs) To UBound(evenCombs) fullComb = Join(SortArray(oddCombs(i) & evenCombs(j)), " ") Cells(rowNum, 1).Value = fullComb rowNum = rowNum + 1 Next j Next i MsgBox "生成完成,共" & (UBound(oddCombs) - LBound(oddCombs) + 1) * (UBound(evenCombs) - LBound(evenCombs) + 1) & "种组合" End Sub ' 以下辅助函数同上方的GetCombinations、Combine、SortArray,可直接复用 Function GetCombinations(arr As Variant, k As Integer) As Variant Dim result As Collection Dim temp() As Variant Set result = New Collection ReDim temp(1 To k) Combine arr, LBound(arr), UBound(arr), 1, k, temp, result Dim output() As Variant ReDim output(1 To result.Count) For i = 1 To result.Count output(i) = result(i) Next i GetCombinations = output End Function Sub Combine(arr As Variant, start As Integer, endNum As Integer, index As Integer, k As Integer, temp As Variant, result As Collection) Dim i As Integer If index > k Then result.Add temp Exit Sub End If For i = start To endNum - (k - index) temp(index) = arr(i) Combine arr, i + 1, endNum, index + 1, k, temp, result Next i End Sub Function SortArray(arr As Variant) As Variant Dim i As Long, j As Long, temp As Variant For i = LBound(arr) To UBound(arr) - 1 For j = i + 1 To UBound(arr) If arr(i) > arr(j) Then temp = arr(i) arr(i) = arr(j) arr(j) = temp End If Next j Next i SortArray = arr End Function
内容的提问来源于stack exchange,提问作者ROCA
相关产品推荐
相关产品推荐

