双色球生成器

要求不考虑复式,允许用户输入上期的结果,要求生成这期的结果不能完全和上期的完全相同(可以部分相同),然后允许用户输入生成的次数。程序如下:
 

import random


def validate_input(prev_red, prev_blue):
    """验证输入号码的合法性"""
    # 检查红球
    if len(prev_red) != 6:
        return False, "红球数量必须为6个"
    if len(set(prev_red)) != 6:
        return False, "红球号码不能重复"
    for num in prev_red:
        if not 1 <= num <= 33:
            return False, f"红球号码{num}超出范围(1-33)"
    # 检查蓝球
    if not 1 <= prev_blue <= 16:
        return False, "蓝球号码超出范围(1-16)"
    return True, ""


def get_previous_numbers():
    """获取并验证用户输入的上一期号码"""
    while True:
        try:
            # 获取红球输入
            red_input = input("请输入上一期红球号码(用逗号分隔6个1-33的数字,例如:1,2,3,4,5,6):")
            prev_red = sorted(list(map(int, red_input.strip().split(','))))

            # 获取蓝球输入
            blue_input = input("请输入上一期蓝球号码(1-16):")
            prev_blue = int(blue_input.strip())

            # 验证输入
            valid, msg = validate_input(prev_red, prev_blue)
            if valid:
                return prev_red, prev_blue
            print(f"输入错误:{msg},请重新输入")
        except ValueError:
            print("输入格式错误,请确保输入的是整数")


def get_generate_times():
    """获取并验证生成次数"""
    while True:
        try:
            times = int(input("请输入要生成的注数(正整数):"))
            if times > 0:
                return times
            print("请输入有效的正整数!")
        except ValueError:
            print("输入格式错误,请输入整数!")


def generate_numbers(prev_red, prev_blue):
    """生成新一期不重复的号码(允许部分重复但避免完全重复)"""
    while True:
        # 生成新红球(允许包含部分上期号码)
        new_red = sorted(random.sample(range(1, 34), k=6))
        # 生成新蓝球(允许与上期相同)
        new_blue = random.randint(1, 16)
        # 检查是否完全重复
        if not (new_red == prev_red and new_blue == prev_blue):
            return new_red, new_blue


def main():
    print("===== 中国双色球生成器 =====")
    print("说明:本程序生成的号码允许部分重复,但不会完全复制上期号码")

    # 获取上期号码(自动排序存储)
    prev_red, prev_blue = get_previous_numbers()

    # 获取生成次数
    times = get_generate_times()

    # 生成多注号码
    results = []
    for _ in range(times):
        results.append(generate_numbers(prev_red, prev_blue))

    # 格式化输出结果
    print(f"\n生成的{times}注新双色球号码:")
    for i, (red, blue) in enumerate(results, 1):
        red_str = ' '.join(f"{num:02d}" for num in red)
        blue_str = f"{blue:02d}"
        print(f"{i}. 红球:{red_str} | 蓝球:{blue_str}")


if __name__ == "__main__":
    main()

你可能感兴趣的:(python,双色球)