一段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)