2013-04-17 3 views
1

Здравствуйте, я пытаюсь создать функцию, включающую в себя случайный модуль, который накапливает сумму нечетных рулонов n-кубических n-сторонних времен. Звучит немного запутанно, но, к примеру, если я скатал 2-стороннюю матрицу 2 раза и получил 1 и 2, результат был бы всего 1 (с 2 четных). Вот что у меня есть:Python: случайный модуль с накопителем сумм для нечетных чисел

import random 

def roll(sides, dice): 
    y = 0 
    for i in range(1, dice+1): 
     if y%2 == 1: 
      y = y + random.randrange(1, sides+1) 
    return y 

Как я могу заставить это работать? Он никогда не проходит мимо первого, если он начинается с y = 0

+2

У вас есть вопрос к нам? – Kevin

+3

Спасибо за обмен. – Bitwise

ответ

1

В вашем коде проблема заключается в том, что вы добавляете случайное число перед проверкой, является ли оно нечетным или даже в вашем цикле for.

Я думаю, что вы ищете что-то вроде этого:

def roll(sides, times): 
    final_sum = 0 
    for i in range(times): 
     randnum = random.randrange(sides) 
     final_sum += randnum if randnum % 2 else 0 
    return final_sum 
1

графа нечетных валков:

count([1 for i in xrange(num_of_rolls) if (random.randint(1, sides)) % 2]) 

Сумма:

rolls = [random.randint(1, sides) for i in range(num_of_rolls)] 
sum_of_odd = sum([roll for foll in rolls if roll % 2]) 

Не тестировался, но должен работать:)

+0

Во-первых, вам не нужны квадратные скобки; во-вторых, вы подсчитываете нечетные рулоны, не суммируя результаты; в-третьих, вы считаете даже рулоны, так как числа лиц лица обычно (и в данном примере) начинаются с 1 ... – redShadow

+0

@redShadow спасибо за отладку :) – J0HN

+0

@JOHN приветствую :) – redShadow

1

..you хотел Oneliner, это Oneliner :)

sum(r for r in (random.randrange(1, sides+1) for i in xrange(dice)) if r % 2) 

В любом случае, чтобы ответить на вопрос OP: чем проблема с вашим кодом является вы проверяете ли сумма до сих пор странно, не текущая матрица рулон ... для этого вам необходимо сделать следующее:

import random 

def roll(sides, dice): 
    total = 0 
    for i in range(dice): 
     result = random.randrange(1, sides+1) 
     if result % 2: 
      y += result 
    return y 
+0

во-первых, вы игнорируете количество рулонов, во-вторых, вы игнорируете количество сторон и третье, мммм, я не знаю, должно быть третье :) Да, randrange (1, side) генерирует значения в [1; стороны), а не [1; сторон], поэтому последнее исключено :) – J0HN

+0

@JOHN oops .. Никогда не копируйте-вставляйте материал из интерпретатора без предварительной проверки: P – redShadow

0

Ваш код должен сначала присвоить случайное значение другой переменной. Затем проверьте, нечетно. Затем добавьте его.

import random 

def roll(sides, dice): 
    y = 0 
    roll = random.randrange(1, sides+1) 
    for i in range(1, dice+1): 
     if roll%2 == 1: 
      y = y + roll 
    return y