2017-06-21 31 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)