2010-04-17 4 views
2

오손으로 중심 한계를 확인하고 싶습니다. 주사위를 굴려 라. 결과를 합산하십시오. 같은 일을 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'는 생성자입니다. 대괄호 대신 라운드를 주목하십시오. –

+0

내가 편집하기 16 초 전에 눈치 채 셨습니다. 감사. – msw

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

'repetitions'이 int라고 가정하면 반복하기가 힘듭니다. – msw

+0

참. 주어진 코드에 대한 개선은 생성기를 반환하는 함수로 제한됩니다. :) –

0

무엇 :

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