2010-04-17 95 views
2

我想用骰子檢查中心限制。卷D骰子。總結結果。重複同樣的事情N次。改變D並重復。重新使用生成器

有沒有必要存儲隨機值,所以我只想使用發電機。問題是發電機被消耗;我無法多次重複使用它們。現在我的代碼使用明確的for,我不喜歡它。

dice_numbers = (1, 2, 10, 100, 1000) 
repetitions = 10000 
for dice_number in dice_numbers: # how many dice to sum 
    sum_container = [] 
    for r in range(repetitions): 
     rool_sum = sum((random.randint(1,6) for _ in range(dice_number))) 
     sum_container.append(rool_sum) 
     plot_histogram(sum_container) 

我想創造這樣

for r in repetitions: 
    rools_generator = (random.randint(1,6) for _ in range(dice_number) 
    sum_generator = (sum(rools_generator) for _ in range(r)) 

,但我第二次再用rools_generator它被消耗。我需要構建一個生成器類嗎?

回答

2

我想你可能是工作太辛苦了,你肯定是創建具有範圍不必要的列表()。在被一點點比上面genexprs更明確的精神:

import random 

def die_roller(throws): 
    """generates throws rolls of a die""" 
    for _ in xrange(throws): 
     yield random.randint(1, 6) 

roller = die_roller(10) 
print type(roller)  # => <type 'generator'> 
print list(roller)  # => [6, 6, 3, 1, 6, 3, 1, 5, 4, 4] 
print sum(roller)  # roller was exhausted, generates null list thus 0 sum 

big_roller = die_roller(10**5) 
print sum(big_roller) # => 3500238 

我想,讓你的你在找什麼雛形。

+0

-1:'rools_generator'是一個生成器。注意圓形而不是方括號。 – 2010-04-18 00:18:26

+0

你注意到我在16秒之前編輯過。謝謝。 – msw 2010-04-18 00:19:18

4

你可以做這樣的:

for r in repetitions: 
    make_rools_generator = lambda: (random.randint(1,6) for _ in range(dice_number)) 
    sum_generator = (sum(make_rools_generator()) for _ in range(r)) 

這將創建一個名爲make_rools_generator函數,調用它時,創建了提供的擲骰一個新的發電機。

+2

假設「重複」是一個整數,它將很難迭代。 – msw 2010-04-18 00:28:30

+0

是的。我對給定代碼的改進僅限於返回生成器的函數。 :) – 2010-04-18 09:44:46

0

這個怎麼樣:

list(list((sum((random.randint(1,6) for _ in range(dn))) for __ in range(10000))) for dn in (1, 2, 10, 100, 1000))