2017-06-21 95 views
0

我创建一个python彩票模拟器,其产生5张随机数从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[:] 

正如预期的那样,计数值以上的约10万元启动需要很长的时间,并开始征税我的系统资源,但我真的想运行更大数量的值。是否有任何修改可以帮助避免多余的步骤?此外,将使用类似PyCUDA或pyOpenCl是有效的和/或内有人很新的编码的范围?

我明白任何帮助,您可以提供或资源,你可以指向我。谢谢!

+0

是'德尔结果[:]'真的有必要吗? –

+0

@ cricket_007你需要'result = []'循环内部,尽管一个简单的列表组件会在xrange(5)中执行相同的'result = [randint(0,75)]' – AChampion

+0

@AChampion Right,但重新分配的税率低于'del'?我会这么认为 –

回答

1

你的彩票数学是一种奇怪的;

首先,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)