[Python] 大乐透-根据近120期统计随机生成号码

import random
import requests
 
 
# 前区规则
def generate_numbers():
    sections = [(1, 12), (13, 24), (25, 35)]
    # 区间比例定义,偶尔出现一次的极端区间比未录入
    ratios_options = [[2, 0, 3], [2, 1, 2], [2, 2, 1], [1, 2, 2], [1, 1, 3], [1, 3, 1], [3, 1, 1], [0, 3, 2],
                      [0, 2, 3], [2, 3, 0], [3, 2, 0]]
    ratios_options_weights = [0.04, 0.13, 0.14, 0.13, 0.06, 0.05, 0.10, 0.06, 0.05, 0.03, 0.05]
    ratios = random.choices(ratios_options, weights=ratios_options_weights, k=1)[0]
 
    picked_numbers = []
    total_sum = 0
 
    # 奇偶比定义
    even_ratio = [(2, 3), (3, 2), (4, 1), (1, 4), (0, 5), (5, 0)]
    weights = [0.28, 0.31, 0.20, 0.13, 0.03, 0.05]
    odd_even_ratio = random.choices(even_ratio, weights=weights, k=1)[0]
    required_odds, required_evens = odd_even_ratio
    total_sum_list = [(30, 39), (40, 49), (50, 59),
                      (60, 69), (70, 79), (80, 89),
                      (90, 99), (100, 109), (110, 119),
                      (120, 129), (130, 139)]
    total_sum_weights = [0.02, 0.01, 0.08, 0.08, 0.14, 0.13, 0.18, 0.15, 0.15, 0.04, 0.02]
    total_sum_result = random.choices(total_sum_list, weights=total_sum_weights, k=1)[0]
    start, end = total_sum_result
 
    attempt = 0  # 记录循环次数
    while not start <= total_sum <= end or len([num for num in picked_numbers if num % 2 != 0]) != required_odds or len(
            [num for num in picked_numbers if num % 2 == 0]) != required_evens:
        picked_numbers.clear()
        total_sum = 0
 
        if attempt == 1000:  # 如果循环1000次没有符合的数据就跳出
            break
 
        for ratio, section in zip(ratios, sections):
            for _ in range(ratio):
                # 选择奇数或偶数
                if len([num for num in picked_numbers if num % 2 != 0]) < required_odds and random.choice(
                        [True, False]):
                    # 选择奇数
                    num = random.choice([n for n in range(section[0], section[1] + 1) if n % 2 != 0])
                else:
                    # 选择偶数
                    num = random.choice([n for n in range(section[0], section[1] + 1) if n % 2 == 0])
 
                # 确保不重复
                while num in picked_numbers:
                    num = random.choice([n for n in range(section[0], section[1] + 1) if
                                         n % 2 != 0]) if num % 2 != 0 else random.choice(
                        [n for n in range(section[0], section[1] + 1) if n % 2 == 0])
 
                picked_numbers.append(num)
                total_sum += num
 
        attempt += 1  # 新增:循环次数加1
    return picked_numbers, total_sum, ratios, odd_even_ratio
 
 
# 随机后区,一大一小
def random_nums():
    small_number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    small_number_weight = [0.10, 0.09, 0.07, 0.06, 0.10, 0.11, 0.08, 0.07, 0.11, 0.08, 0.05, 0.08]
 
    # 选择第一个数
    first_number = random.choices(small_number, weights=small_number_weight, k=1)[0]
 
    # 移除第一个数后重新计算权重
    updated_weights = [w / (1 - small_number_weight[small_number.index(first_number)]) for i, w in enumerate(small_number_weight) if small_number[i] != first_number]
    updated_numbers = [n for n in small_number if n != first_number]
 
    # 选择第二个数
    second_number = random.choices(updated_numbers, weights=updated_weights, k=1)[0]
 
    return [first_number, second_number]
 
 
def fetch_and_convert_result():
    url = "https://webapi.sporttery.cn/gateway/lottery/getHistoryPageListV1.qry?gameNo=85&provinceId=0&pageSize=30&isVerify=1&pageNo=1"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
 
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # 确保请求成功
 
    # 解析JSON响应
    data = response.json()
 
    # 获取第一个开奖结果
    first_result = data['value']['list'][0]['lotteryDrawResult']
 
    # 将开奖结果字符串转换为列表
    result_list = [int(num) for num in first_result.split()][:5]
 
    return result_list
 
 
# 判断是否有连号
def has_consecutive_numbers(numbers):
    numbers.sort()  # 对列表进行排序
    for i in range(len(numbers) - 1):
        if numbers[i] + 1 == numbers[i + 1]:
            return True
    return False
 
 
# 打印符合条件的10组数据
list = fetch_and_convert_result()
count = 0
while count < 10:
    try:
        numbers, total_sum, ratios, odd_even_ratio = generate_numbers()
        has_numbers = has_consecutive_numbers(numbers)
        behind = random_nums()
        max_value = max(numbers)
        min_value = min(numbers)
        span = max_value - min_value
        # 上期开的号码
        # 将列表转换为集合
        set1 = set(list)
        set2 = set(numbers)
 
        # 计算两个集合的交集,算出重号个数
        common_elements = set1.intersection(set2)
        repeatlist = [0, 1, 2]
        repeatlist_weight = [0.42, 0.48, 0.10]
        repeat = random.choices(repeatlist, weights=repeatlist_weight, k=1)[0]
        # 重号几个
        if len(common_elements) == repeat:
            # 是否需要连号,如果需要连号就改成 if has_numbers:
            if not has_numbers:
                with open('大乐透.txt', 'a', encoding='utf-8') as file:
                    print("前区:", sorted(numbers), "后区:", sorted(behind), "和值:", total_sum, "跨度:", span,
                          "区间比:",
                          ratios, "奇偶比:", odd_even_ratio, "跟上期重号个数:", repeat, file=file)
                count += 1
    except Exception as e:
        pass
 
print("预祝您中奖!!!")
print("上期开奖号码:", list)

成品打包:

https://download.csdn.net/download/cc605523/89592968

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据服务生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值