2010-04-17 98 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))