我创建了一个 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, 5
与1, 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] 删除。
我来说两句