首页 > 解决方案 > 计算具有 m 个面的 n 个骰子的频率 + 如何对元组中的元素进行排序。Python

问题描述

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

我正在学习循环,我正在尝试在 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']]

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

标签: pythonloopsfor-loopdice

解决方案


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) 将检查列表中每个元素的键并返回相应排序的列表。


推荐阅读