2013-10-04 3 views
1

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

Код работает очень хорошо, и я могу получить список в конце, но мой список продолжает иметь 0 вместо четырех, поэтому кажется, что моя функция не удерживает вкладки на число 4, свернутое или не свернутое вообще.

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

Вот мой код.

def rollDie(number): 
    one = 0 
    two = 0 
    three = 0 
    four = 0 
    five = 0 
    six = 0 
    for i in range(0, number): 
     roll=int(random.randint(1,6)) 
     if roll == 1: 
      one = one+1 
     elif 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 
    return [one,two,three,four,five,six] 

ответ

8

У вас есть небольшая опечатка; вы тестируете равенства, не назначая:

four == four+1 

должно быть:

four = four+1 

Однако, у вас уже есть число между 1 и 6, то почему бы не сделать это в качестве индекса в списке результатов? Таким образом, вам не нужно использовать столько заявлений if. Храните ваши данные из ваших имен переменных:

def rollDie(number): 
    counts = [0] * 6 
    for i in range(number): 
     roll = random.randint(1,6) 
     counts[roll - 1] += 1 
    return counts 
+0

Ну и теперь я чувствую себя глупо делать такую ​​тупую ошибку. Спасибо за то, что я проверял орфографию, хотя я ценю ваше время. –

+0

Errr ... @MartijnPieters всегда быстрее всех для переписывания такого алгоритма, черт: p –

-1

Вы должны сделать random.randint(1, 7), иначе вы никогда не получите 6.

... 
roll = random.randint(1, 7) 
+3

Нет, 'randint()' is * включительно *. Вы думаете о 'randrange()'. –

+0

Нет, это не включено. docstring 'randint' говорит: * Возвращает случайные целые числа от' low' (включительно) до 'high' (эксклюзивный). * – user278064

+0

См. Http://docs.python.org/2/library/random.html#random .randint, 'Возвращает случайное целое число N такое, что a <= N <= b'. –

0

Я не могу улучшить ответ Мартейн Питерс в. :-) Но эту проблему можно более удобно решить с помощью списка.

import random 

def rollDie(number): 
    # create a list with 7 values; we will only use the top six 
    rolls = [0, 0, 0, 0, 0, 0, 0] 
    for i in range(0, number): 
     roll=int(random.randint(1,6)) 
     rolls[roll] += 1 
    return rolls 

if __name__ == "__main__": 
    result = rollDie(1000) 
    print(result[1:]) # print only the indices from 1 to 6 

И, это немного сложнее, но здесь это лучший способ, чтобы создать список из 7 записей всех установленных нулю:

rolls = [0] * 7 

Почему считать нули сами? Легче просто сделать Python для вас. :-)

EDIT: список имеет длину 7, потому что мы хотим использовать индексы с 1 по 6. В списке есть также позиция 0, но мы ее не используем.

Другой способ сделать это - нанести броски кубиков на индексы. Это довольно простое сопоставление: просто вычтите 1. Таким образом, бросок кубика 1 войдет в индекс 0 списка, бросок кубика 2 войдет в индекс 1 и так далее. Теперь мы будем использовать каждую позицию в списке.

Вот что версия:

import random 

def rollDie(number): 
    rolls = [0] * 6 
    for i in range(0, number): 
     roll=int(random.randint(1,6)) 
     rolls[roll - 1] += 1 
    return rolls 

if __name__ == "__main__": 
    result = rollDie(1000) 
    print(result) 
+0

Почему 7, когда это шестигранная матрица? – Fatlad

+0

Поскольку случайные числа от 1 до 6, но индексы индексов начинаются с 0. Я мог бы также сделать список длинным 6, но затем вычесть 1 из каждого рулона. Хм, я добавлю это к ответу. – steveha

+0

Да, извините, оглядываясь на него, мой комментарий был совсем нечитающим, я уйду и обвиню его в недостатке сна ... – Fatlad

-2
import random 

def dice(): 

    print random.randint(1,6) 

dice() 
+1

Ваш ответ будет лучше принят, если вы объясните, что было не так с тем, что было у OP и почему ваш ответ лучше, чем остальные, которые здесь. – zondo

Смежные вопросы