你的彩票數學是一種奇怪的;
首先,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'?我會這麼認爲 –