m0_69891663 2023-04-12 23:03 采纳率: 0%
浏览 109
已结题

大数据筛选,6位数盲盒抽中奖概率问题

6位数盲盒抽奖游戏
例如在25选6所有排列组合中,目标中奖号码是必定在这组合里的一个。
例如现在给一批25选6的分数据,事先不会告诉你中奖号码。但知道里面的组合最多只能命中目标5个号码,最少一个都没有。现在以分数据作为依据,与总数据对比筛选。缩小范围,提高命中率。
总数据120万左右(无重复),分数据11万左右(有重复,估计认为不重复10万)。

以正常理解,用总数据与分数据直接对比,剔除后剩余110万左右排列组合数据量。范围太大,不可取。现已知分数据里的排列组合最多只能命中5位数,最少0位。中奖号码在未知情况下,不确定必然中奖码。用什么筛选逻辑缩减到可实施的范围内(100组以内),必然包括中奖号码。

  • 写回答

10条回答 默认 最新

  • 发愤图强的程序员 2023-04-12 23:50
    关注

    一种可能的策略是,先将分数据中的每个数字单独筛选出来,得到6个数字集合。然后对于每个数字集合,从总数据中筛选出包含该集合中至少1个数字的所有组合,得到6个子数据集合。接下来,对于每个子数据集合,计算其与目标中奖号码的匹配度,即该子数据集合中包含的目标号码数量。最后,将匹配度最高的前50-100个子数据集合作为最终的筛选结果。
    具体实现步骤如下:
    将分数据中的每个数字单独筛选出来,得到6个数字集合。
    对于每个数字集合,从总数据中筛选出包含该集合中至少1个数字的所有组合,得到6个子数据集合。可以使用哈希表等数据结构来加速筛选过程。对于每个子数据集合,计算其与目标中奖号码的匹配度,即该子数据集合中包含的目标号码数量。可以使用位运算等技巧来快速计算匹配度。
    将匹配度最高的前50-100个子数据集合作为最终的筛选结果。
    具体实现时,可以使用Python等编程语言来实现。以下是一个简单的示例代码:

    import itertools
    
    # 目标中奖号码
    target = set([1, 2, 3, 4, 5, 6])
    
    # 分数据
    data = [
        [1, 2, 3, 4, 5, 25],
        [1, 6, 7, 10, 15, 23],
        # ...
    ]
    
    # 将分数据中的每个数字单独筛选出来,得到6个数字集合
    digit_sets = [set(d) for d in zip(*data)]
    
    # 对于每个数字集合,从总数据中筛选出包含该集合中至少1个数字的所有组合
    subsets = []
    for digits in digit_sets:
        subset = set()
        for d in digits:
            subset |= set(filter(lambda x: d in x, total_data))
        subsets.append(subset)
    
    # 对于每个子数据集合,计算其与目标中奖号码的匹配度
    scores = []
    for subset in subsets:
        score = sum([1 for t in target if t in subset])
        scores.append(score)
    
    # 将匹配度最高的前50-100个子数据集合作为最终的筛选结果
    result = []
    for i in sorted(range(len(scores)), key=lambda x: scores[x], reverse=True)[:100]:
        result.append(subsets[i])
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 修改了问题 4月13日
  • 修改了问题 4月13日
  • 修改了问题 4月13日
  • 展开全部