Python: вращающиеся многогранные кубики не добавляются в список - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать систему, которая будет бросать разные многогранные кубики в разных количествах, чтобы определить эффект добавления большего количества кубиков к шансам получить наибольшее число.

import random
from statistics import mean

#define the dice
class Dice:
    """these are the dice to roll"""
    def __init__(d, qty, sides):
        d.qty = qty
        d.sides = sides


q1d4 = Dice(1, 4)
q2d4 = Dice(2, 4)
q3d4 = Dice(3, 4)
q4d4 = Dice(4, 4)
#...removed extras for clarity
q5d20 = Dice(5, 20)
q6d20 = Dice(6, 20)

def Roll(Dice):

    i = 0
    while i < 10:
        single_rolls = []
        highest_of_rolls = []
        avg_of_highest = []
        qty = Dice.qty
        sides = Dice.sides

В этой строке я могу успешно бросить случайное число между 1 и числом сторон, и оно добавляется в список single_rolls, и это показано в операторе печати:

        for q in range(qty):
            #rolls a single dice "qty" times and appends the result to single_rolls
            single_rolls.append(random.randint(1, sides))
            print(single_rolls)

Затем я пытаюсь добавить только наибольшее число из списка single_rolls в список наибольших_файлов в цикле while для каждой итерации бросков, а затем усреднить его:

        highest_of_rolls.append(max(single_rolls))
        print(highest_of_rolls)
        i += 1

    avg_of_highest = mean(highest_of_rolls)
    print(avg_of_highest)

Похоже, он не добавляется в список самое высокое_рф, когда я его запускаю. Из оператора печати кажется, что он успешно находит наибольшее число из двух рулонов, но список наибольших_файлов не растет, как я ожидал.

Наконец, в конце кода среднее значение всегда является только последним значением, которое должно было бы войти в самое высокое значение_р_кроллов, а не где-то близко к среднему значению.

Вот пример вывода, который кажется подозрительным:

>>> Roll(q2d20)
[11]
[11, 14]
[14]
[15]
[15, 1]
[15]
[4]
[4, 9]
[9]
[15]
[15, 2]
[15]
[1]
[1, 16]
[16]
[9]
[9, 3]
[9]
[18]
[18, 9]
[18]
[20]
[20, 11]
[20]
[13]
[13, 5]
[13]
[20]
[20, 10]
[20]
20

Даже в моем простом понимании статистики видно, что 20 не является средним числом нескольких чисел ниже 20, и, кроме того, это число сильно колеблется и всегда является просто последним числом, которое попадет в список наибольших_файлов.

Я чувствую, что где-то произошла ошибка отступа, но я пробовал написать несколько способов, и она всегда кажется одинаковой. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018
def Roll(Dice):

i = 0
while i < 10:
    single_rolls = []
    highest_of_rolls = [] # <--- reseting highest_of_rolls to a blank list
    avg_of_highest = []
    qty = Dice.qty
    sides = Dice.sides

Решение

def Roll(Dice):

i = 0
highest_of_rolls = [] # <--- move outside of loop, won't erase items

while i < 10:
    single_rolls = []
    avg_of_highest = []
    qty = Dice.qty
    sides = Dice.sides

Также вместо использования while i < 10: и увеличения i вы можете использовать for i in range(10), ничто не отличается, просто устраняя необходимость увеличения i для каждого цикла.

0 голосов
/ 03 сентября 2018

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

Надеюсь, это полезно.

...