提高大型彩票模拟的效率

杰森·西格勒

我创建了一个 python 彩票模拟器,它生成 5 个随机数的数组,从 0 到 75(“中奖号码”):

    for n in xrange(0, 5):
    winning_number.append(randint(0, 75))

然后它会根据“获胜”数组检查用户定义的“门票”数量(“计数”变量)。

while count > 0:
    for n in xrange(0, 5):
        result.append(randint(0, 75))
    if result == winning_number:
        wingame += 1
        count -= 1
        del result[:]
    else:
        count -= 1
        del result[:]

正如预期的那样,超过大约 1000 万的计数值开始需要很长时间并开始消耗我的系统资源,但我真的想运行更大的计数值。我是否可以进行任何修改来帮助避免多余的步骤?此外,使用 PyCUDA 或 pyOpenCl 之类的东西是否有效和/或在编码新手的范围内?

我感谢您可以提供的任何帮助或您可以指向我的资源。谢谢!

休博思韦尔

你的彩票数学有点奇怪;

首先,random.randint(0, 75)生成包含两个端点的值 - 因此您要从 76 个值 (0 .. 75) 中进行选择。也许你的意思是(1, 75)

其次,您允许重复值,即3, 3, 3, 3, 3有效票证。彩票一般不允许重复。看一看random.sample,即random.sample(range(1, 76), 5)

第三,您选择值的顺序显然很重要 -1, 2, 3, 4, 51, 3, 2, 4, 5. 彩票一般不考虑顺序(可能的奖金号码除外)。在 Python 术语中,您应该比较集合而不是列表。

第四,实际生成值列表涉及大量的内存分配和释放;通过对状态进行操作而不是实际生成每个状态,您可以更便宜地获得相同的效果。例如,您可以说这{1, 4, 7, 19, 21}是百万分之一和三分之一的组合,然后测试randvalue == 1000003而不是randset == {1, 4, 7, 19, 21}

实施这些更改,您可以简化您的逻辑,例如

from random import randrange
from math import factorial

VALUES = 75
PICKS = 5
TICKETS = 10000000

# calculate number of unique tickets
num_combos = factorial(VALUES) // (factorial(VALUES - PICKS) * factorial(PICKS))

winner = randrange(num_combos)
num_winners = sum(randrange(num_combos) == winner for _ in range(TICKETS))

编辑:快速思考并进行了测试;

num_winners = sum(1 for _ in range(TICKETS) if randrange(num_combos) == winner)

大约快 5%。(现在超过 85% 的运行时间仅用于生成随机值。)

Edit2:另一个想法——如果我们任意说“0 是获胜状态”,那么我们的主循环就变成了

num_winners = sum(1 for _ in range(TICKETS) if not randrange(num_combos))

这又将其速度提高了 2.5%。


或者,您可以直接进入最终解决方案,

from numpy.random import poisson

num_winners = poisson(TICKETS / num_combos)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中提高大数模乘法的效率

来自分类Dev

如何提高大型数据集中Python计算的速度?

来自分类Dev

在Python 3.4中提高大型字典的速度

来自分类Dev

提高大型数据集上谓词的性能

来自分类Dev

创建辅助表以提高大型MySQL表的性能?

来自分类Dev

提高读取大型CSV文件的效率

来自分类Dev

如何通过替换“ for-loop”和“ if-else”子句来提高大型数据集的性能

来自分类Dev

使用索引或以任何其他可能的方式提高大型文档中大型集合的查询性能

来自分类Dev

如何在旧的大型综合维修项目中提高工作效率

来自分类Dev

R 提高嵌套 for() 循环的效率,以便在大型数据集中进行简单的距离计算

来自分类Dev

如何提高大n的Fibonacci实现的精度?

来自分类Dev

如何提高大数据性能?

来自分类Dev

提高linq查询效率

来自分类Dev

提高嵌套的应用效率

来自分类Dev

如何提高循环效率

来自分类Dev

如何提高循环效率

来自分类Dev

如何提高XSLT效率

来自分类Dev

提高程序效率

来自分类Dev

提高嵌套 for 循环的效率

来自分类Dev

如何提高算法的效率?

来自分类Dev

对大型2D数据帧进行矢量化处理,以提高optimx L-BFGS-B的效率

来自分类Dev

如何提高大数双精度型的精度?

来自分类Dev

如何提高大文件的Python迭代性能

来自分类Dev

提高大表有序顶部查询的性能

来自分类Dev

在Docker映像构建时排除路径以提高大小

来自分类Dev

试图提高数组搜索的效率

来自分类Dev

提高PostgreSQL设置差异效率

来自分类Dev

如何提高该程序的效率?

来自分类Dev

提高R的效率(向量化?)