重用发电机

时间:2010-04-17 22:41:36

标签: python generator

我想用骰子检查中央限制。滚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它就被消耗了。我需要构建一个生成器类吗?

3 个答案:

答案 0 :(得分:5)

你可以这样做:

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的函数,当调用它时,会创建一个提供骰子卷的新生成器。

答案 1 :(得分:2)

我认为你可能工作太辛苦了,你肯定会用range()创建不必要的列表。本着比上面的基因更明确的精神:

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

我认为这可以为您提供所需内容的基础。

答案 2 :(得分:0)

这个怎么样:

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