你的彩票数学是一种奇怪的;
首先,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)
是'德尔结果[:]'真的有必要吗? –
@ cricket_007你需要'result = []'循环内部,尽管一个简单的列表组件会在xrange(5)中执行相同的'result = [randint(0,75)]' – AChampion
@AChampion Right,但重新分配的税率低于'del'?我会这么认为 –