Рассчитайте частоту n кубиков с m гранями + как упорядочить элементы в кортежах. Python - PullRequest
0 голосов
/ 25 февраля 2020

Я начинающий, и это мой первый вопрос к сообществу.

Я изучаю циклы и пытаюсь создать программу на Python, которая позволяет мне вычислять частоту сумм это может быть результатом броска n кубиков с m гранями. Переменные n и m должны быть введены пользователем. Я знаю, что вы, наверное, видели эту проблему много раз, но я не мог найти правильный ответ на мое решение, возможно, из-за того, как я структурировал свой код до сих пор:

import numpy as np
sums = []
frequency = []
probability = []
lst = []
n = int(input("Enter the number of dice: "))
m = int(input("Enter the number of faces in the dice: "))
lst = list(range(m + 1)[1:])
print(lst)
for item in (lst):
  for x in (lst):
    sums.append(item+x)
counter = len(sums)
for item in (sums):
  frequency.append(sums.count(item))
for item in frequency:
  probability.append(item/counter)
probability = ['%.3f' % elem for elem in probability]
results = np.column_stack((sums, probability))
new_results = [tuple(row) for row in results]
uniques = np.unique(new_results, axis=0)
print(uniques)

, и это результат ( как вы можете видеть, он работает только с 2 кубиками):

[['10' '0.083']
 ['11' '0.056']
 ['12' '0.028']
 ['2' '0.028']
 ['3' '0.056']
 ['4' '0.083']
 ['5' '0.111']
 ['6' '0.139']
 ['7' '0.167']
 ['8' '0.139']
 ['9' '0.111']]

Я застрял в следующих двух проблемах:

  1. Я изо всех сил пытаюсь понять, как повторите l oop для n кубиков. Я думаю, что способ, которым я проектировал программу, усложнил ситуацию в этом смысле. Не могли бы вы помочь?
  2. Как правильно заказать вывод? Я хотел бы, чтобы результаты были следующими:
[['2' '0.028']
 ['3' '0.056']
 ['4' '0.083']
 ['5' '0.111']
 ['6' '0.139']
 ['7' '0.167']
 ['8' '0.139']
 ['9' '0.111']
 ['10' '0.083']
 ['11' '0.056']
 ['12' '0.028']]

Я был бы очень признателен, если бы вы могли помочь мне решить эти проблемы. Кроме того, любое предложение по улучшению моего кода будет отличным! Спасибо, Марко

1 Ответ

0 голосов
/ 25 февраля 2020

1: Теоретически вы бы добавили больше кубиков, вложив больше циклов в строки 11 и 12. Но, насколько мне известно, это невозможно во время выполнения, я бы использовал рекурсивный подход:

def alloutcomes(mylist, sides, throwsleft):
  if throwsleft == 0:
    return mylist
  else:
    newlist = []
    for x in mylist:
      for i in range(1, sides+1):
        newlist.append(x+i)
    return alloutcomes(newlist, sides, throwsleft-1)

Тогда sums = alloutcomes([0], m, n) - это список, который вы ищете. Если вы go просматриваете этот код на листе бумаги, имитируя каждый шаг, вы быстро поймете, как он работает. С этим списком вы сможете продолжить нормально

2: Чтобы отсортировать список нецелых переменных, вы можете использовать sorted() вместе с ключом (). Сначала вам нужно определить функцию «ключ», которая выделяет каждый элемент, который вы в нее помещаете, целое число. В вашем случае вы просто вернете первый элемент каждого кортежа. После сортировки (список, ключ) проверяет ключ каждого элемента в списке и возвращает список, который отсортирован соответствующим образом.

...