Проблема с программой игры в кости

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

`

import random
def rollDie():
    one = 0
    two = 0
    three = 0
    four = 0
    five = 0
    six = 0
    seven = 0
    eight = 0
    nine = 0
    ten = 0 
    eleven = 0
    twelve = 0
    for i in range(0, 1000):
        roll = int(random.randint(1,6)) + (random.randint(1,6))
        if roll == 2:
            two = two+1
        elif roll == 3:
            three = three+1
        elif roll == 4:
            four = four+1
        elif roll == 5:
            five = five+1
        elif roll == 6:
            six = six+1
        elif roll == 7:
           seven = six+1
        elif roll == 8:
           eight = eight+1 
        elif roll == 9:
           nine = nine+1 
        elif roll == 10:
           ten = ten+1
        elif roll == 11:
           eleven = eleven+1
        elif roll == 12:
           twelve = twelve+1
    print "2:%s" % two
    print "3:%s" % three
    print "4:%s" % four
    print "5:%s" % five
    print "6:%s" % six
    print "7:%s" % seven
    print "8:%s" % eight
    print "9:%s" % nine
    print "10:%s" % ten
    print "11:%s" % eleven
    print "12:%s" % twelve
rollDie()

`

Благодарю вас!


person user3624667    schedule 11.05.2014    source источник
comment
К вашему сведению, у вас здесь ошибка: seven = six+1. Я думаю, вы хотите seven + 1 там.   -  person dano    schedule 11.05.2014
comment
Кроме того, программа, запущенная точно так, как вы ее здесь разместили, печатает список чисел только один раз.   -  person dano    schedule 11.05.2014
comment
@dano прав, я тоже только что запустил его. Питон27, Вин7.   -  person theWanderer4865    schedule 11.05.2014
comment
Уверены ли вы? Потому что для меня, когда я набираю терминал python Dice.py, он возвращает список 1000 раз.   -  person user3624667    schedule 11.05.2014
comment
100% уверен! Интересно, используете ли вы табуляции в текстовом редакторе, а не пробелы, и это приводит к тому, что отступ, интерпретируемый Python, отличается от того, что вы видите в своем файле. Попробуйте преобразовать все табуляции в пробелы в файле .py и повторите попытку.   -  person dano    schedule 11.05.2014
comment
Ага. Я не знаю, что именно отличается в вашем файле, но эта версия, которую вы вставили, работает так, как предполагалось.   -  person theWanderer4865    schedule 11.05.2014
comment
Спасибо. Я использовал пробелы. Я немного новичок в python, и ваш совет приветствуется.   -  person user3624667    schedule 11.05.2014
comment
Этот код просто кричит, используйте список. Игнорируйте этот комментарий, если у вас еще не пройдены списки, или это запрещено для данной задачи. Но используя список, было бы намного короче и проще имитировать бросок 10 кубиков за раз.   -  person Gary Walker    schedule 11.05.2014
comment
Да, очень плохо использовать такие именованные переменные. Либо используйте список размером 12, либо словарь с целыми числами от 2 до 12 в качестве ключей...   -  person beroe    schedule 11.05.2014


Ответы (2)


Я предполагаю, что у вас отключен отступ в текстовом редакторе; операторы печати заключены в цикл for. У тебя тоже есть небольшая проблема, ты звонишь seven = six+1. Вот ваш отредактированный код, попробуйте вместо этого вставить это в свой файл:

import random
def rollDie():
    one = 0
    two = 0
    three = 0
    four = 0
    five = 0
    six = 0
    seven = 0
    eight = 0
    nine = 0
    ten = 0 
    eleven = 0
    twelve = 0
    for i in range(0, 1000):
        roll = int(random.randint(1,6)) + (random.randint(1,6))
        if roll == 2:
            two = two+1
        elif roll == 3:
            three = three+1
        elif roll == 4:
            four = four+1
        elif roll == 5:
            five = five+1
        elif roll == 6:
            six = six+1
        elif roll == 7:
           seven = seven+1
        elif roll == 8:
           eight = eight+1 
        elif roll == 9:
           nine = nine+1 
        elif roll == 10:
           ten = ten+1
        elif roll == 11:
           eleven = eleven+1
        elif roll == 12:
           twelve = twelve+1
    print "2:%s" % two
    print "3:%s" % three
    print "4:%s" % four
    print "5:%s" % five
    print "6:%s" % six
    print "7:%s" % seven
    print "8:%s" % eight
    print "9:%s" % nine
    print "10:%s" % ten
    print "11:%s" % eleven
    print "12:%s" % twelve
rollDie()

Кроме того, ваш код крайне неэффективен; вместо этого попробуйте использовать следующий код:

import random
rolls = {}
for k in range(2, 13):
        rolls[k] = 0

for k in range(1000):
        roll = random.randint(1, 6)+random.randint(1, 6)
        rolls[roll]+=1

for k in rolls:
        print '%d occurred %d times!' %(k, rolls[k])

Это работает как:

bash-3.2$
2 occurred 38 times!
3 occurred 51 times!
4 occurred 90 times!
5 occurred 99 times!
6 occurred 136 times!
7 occurred 173 times!
8 occurred 151 times!
9 occurred 90 times!
10 occurred 92 times!
11 occurred 58 times!
12 occurred 22 times!
bash-3.2$

Если мы рассчитываем наши программы, вот ваше время:

This ran in 0.06672 seconds!

А вот мой:

This ran in 0.004228 seconds!

Конечно, это может быть только мой компьютер, дающий такую ​​большую разницу :). Если вам интересно, как я рассчитал время, я использовал time.time() - previous time.time().

person A.J. Uppal    schedule 11.05.2014

без переменных, и мы можем добиться той же функции броска костей таким же образом:

import random
    from collections import Counter,OrderedDict


    def ran(i):
        roll = int(random.randint(1,6)) + (random.randint(1,6))
        return roll

    for i,j in OrderedDict(Counter(map(ran,range(1,1000)))).items():
        print i,":", j

Объяснение: сначала мы сохраняем все значения rand int в ссылках dict.map, которые запускал метод. затем usinf counter v может найти все частоты, затем oded dict используется для сортировки в соответствии с ключом, т.е. первым номером 2 и так далее.

person sundar nataraj    schedule 11.05.2014