【问题标题】:Calculate the frequency of n dice with m faces + how to order elements in tuples. Python计算具有 m 个面的 n 个骰子的频率 + 如何对元组中的元素进行排序。 Python
【发布时间】:2020-06-09 06:47:17
【问题描述】:

我是一个完整的初学者,这是我向社区提出的第一个问题。

我正在学习循环,我正在尝试在 Python 中创建一个程序,该程序允许我计算由 m 个面的 n 个骰子滚动产生的总和的频率。变量 nm 应由用户输入。我知道你一定已经多次看到这个问题,但我找不到我的解决方案的正确答案,可能是因为我迄今为止构建代码的方式:

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. 我很难理解如何为 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']]

如果您能帮助我解决这些问题,我将不胜感激。此外,任何改进我的代码的建议都会很棒! 谢谢, 马可

【问题讨论】:

  • 对于第二点,尝试对数组进行排序(使用每个列表的第一个元素作为键),然后将其打印出来

标签: python loops for-loop dice


【解决方案1】:

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) 就是您要查找的列表。如果你用一张纸浏览这段代码,模仿每一步,你会很快理解它是如何工作的。有了这个列表,你就可以正常继续了

2:要对非整数变量列表进行排序,可以使用sorted() 和 key()。 您首先必须定义一个“键”函数,它将您放入其中的每个元素分配一个整数。在您的情况下,您只需返回每个元组的第一个元素。然后 sorted(list, key) 将检查列表中每个元素的键并返回一个相应排序的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2015-10-18
    • 2020-04-22
    • 1970-01-01
    • 2010-09-15
    • 2013-08-24
    相关资源
    最近更新 更多