Python实现聪明组合代码改进版,本代码类似于旋转矩阵缩水,但又和旋转矩阵不同,它实现的是在保证随机性的情况下实现选中的每个号码出现次数相同。
选定号码随机组合
我们今天利用Python来实现选定集合里的每个数,在一定的组合数量里,力求出现的次数相等。
本段代码适用于大乐透双色球和快乐8等。
快乐8
可自行修改下面的代码。
说明:代码里的数据集合为上期双色球号码注水,仅仅是为了代价可以直观地看看缩水成效如何。
import randomfrom itertools import combinationsdef generate_groups(numbers, group_size, num_groups): """从集合中随机选出指定数量的组合,尽量保证每个数被选中的次数相同""" n = len(numbers) total_selections = group_size * num_groups max_selections_per_number = total_selections // n # 每个数最多被选中的次数 # 初始化每个数的选中次数 selection_counts = {num: 0 for num in numbers} # 存储最终选中的组合 selected_groups = [] # 所有可能的组合 all_combinations = list(combinations(numbers, group_size)) while len(selected_groups) < num_groups: # 随机选择一个组合 valid_combinations = [combo for combo in all_combinations if all(selection_counts[num] < max_selections_per_number for num in combo)] if not valid_combinations: break # 如果没有有效的组合,退出循环 group = random.choice(valid_combinations) # 选中该组合 selected_groups.append(group) # 更新每个数的选中次数 for num in group: selection_counts[num] += 1 return selected_groups, selection_countsdef main(): # 给定的大乐透双色球或者快乐8选定号 numbers = [2, 6, 7, 13, 16, 17, 20, 22, 24, 26, 29, 33] group_size = 6 # 双色球每组选6个数大乐透的话这里改为5快乐8根据选几来改选九就改为9 num_groups = 20 # 最后自动选出20组可根据自己的需求来修改 # 生成符合条件的组合随机出号 selected_groups, selection_counts = generate_groups(numbers, group_size, num_groups) # 输出结果 print("选中的20组组合:") for i, group in enumerate(selected_groups, 1): print(f"第{i}组: {group}") print("\n每个数被选中的次数:") for num, count in selection_counts.items(): print(f"数字 {num}: {count} 次")if __name__ == "__main__": main()这个代码是实现每个集合中的数都有差不多的出现次数,保持了数据分布的均匀。
代码运行示例。
★
祝您蛇年吉祥
选中的20组组合:
第1组: (2, 13, 20, 22, 26, 33)
第2组: (13, 16, 17, 20, 22, 26)
第3组: (7, 17, 20, 22, 29, 33)
第4组: (7, 16, 20, 22, 29, 33)
第5组: (6, 13, 17, 24, 29, 33)
第6组: (7, 13, 16, 20, 26, 33)
第7组: (6, 13, 17, 26, 29, 33)
第8组: (2, 7, 13, 16, 20, 24)
第9组: (2, 6, 17, 24, 29, 33)
第10组: (7, 13, 20, 22, 24, 33)
第11组: (2, 7, 17, 22, 24, 29)
第12组: (2, 6, 13, 16, 24, 33)
第13组: (7, 16, 17, 20, 26, 29)
第14组: (7, 13, 22, 26, 29, 33)
第15组: (2, 7, 17, 20, 22, 24)
第16组: (6, 13, 16, 17, 22, 26)
第17组: (2, 6, 7, 17, 24, 26)
第18组: (2, 6, 16, 22, 24, 29)
第19组: (2, 16, 20, 24, 26, 29)
每个数被选中的次数:
数字 2: 9 次
数字 6: 7 次
数字 7: 10 次
数字 13: 10 次
数字 16: 9 次
数字 17: 10 次
数字 20: 10 次
数字 22: 10 次
数字 24: 10 次
数字 26: 9 次
数字 29: 10 次
数字 33: 10 次
程序运行结束。