【问题标题】:Best way to calculate lottery numbers? [closed]计算彩票号码的最佳方法? [关闭]
【发布时间】:2019-12-22 16:19:07
【问题描述】:

彩票中奖者需要从以下指定的数组中下注 6 个号码。

提取可能的组合 - 代码由两部分组成:

第 1 阶段 - 获取所有排列:

a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]

combinations = tuple(itertools.permutations(a, 6))

第 2 阶段 - 扣除所有组合:

我从另一个帖子 here 获得了一些帮助来删除任何此类重复项,因为在彩票中,[1,3,5] 的组合类似于投注[5,1,3]

机器已启动,但在第一阶段结束前内存不足。

我知道你们中的大多数人会建议升级到 64 位等,但我正在寻找更有效的代码来处理我当前机器上的必要结果。主要用于学习目的。

非常感谢您的回复!

【问题讨论】:

  • 我们看不到的代码很难调试。
  • 不确定您在这里尝试输出什么?长度为 6 的 38 个唯一项的列表有 19 亿个排列,因此您的代码试图生成 19 亿个列表,这就是内存不足的原因。
  • 顺便说一句,您的代码内存不足,试图为 1,402,410,240 个数字元组分配足够的内存,然后对其进行过滤。在我的 Python 3.7 上,每个这样的元组消耗 104 个字节,因此您至少需要 145 GB 的内存。
  • 请考虑提出好问题的准则:stackoverflow.com/help/how-to-ask

标签: python


【解决方案1】:

既然您正在寻找组合,只需使用itertools.combinations()...

>>> import itertools
>>> numbers = list(range(1, 38))
>>> combinations = set(itertools.combinations(numbers, 6))
>>> print(len(combinations))
    2324784

【讨论】:

  • 正确,但效率低下。无需生成所有结果,只需对它们进行计数。您可以轻松计算出有多少:factorial(37) // factorial(37-6) // factorial(6).
  • 当然!假设 OP 在某些时候也可能需要这些组合,这也向他们展示了如何使用它们。
  • 谢谢!这完美地工作。在您发表评论之前不知道 itertools.combinations :)
猜你喜欢
  • 2014-05-07
  • 2021-03-04
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2020-04-12
相关资源
最近更新 更多