python - 计算具有 m 个面的 n 个骰子的频率 + 如何对元组中的元素进行排序。Python
问题描述
我是一个完整的初学者,这是我向社区提出的第一个问题。
我正在学习循环,我正在尝试在 Python 中创建一个程序,该程序允许我计算由具有 m 个面的 n 个骰子滚动产生的总和的频率。变量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']]
我陷入以下两个问题:
- 我正在努力理解如何为 n 骰子重复循环。我认为我设计程序的方式在这个意义上使事情变得困难。能否请你帮忙?
- 如何以正确的方式订购输出?我希望结果如下:
[['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:理论上,您可以通过在第 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) 将检查列表中每个元素的键并返回相应排序的列表。
推荐阅读
- swift - 集合视图右侧没有边距
- javascript - 由于单击提交按钮,刷新后保持在同一页面上
- html - 绝对定位的 CSS 对齐问题
- c# - 使用 MIP SDK 如何使用自定义权限进行保护
- sql - GROUP BY 不工作时如何获取汇总总和?
- python - 无法在 docker build 中继续
- javascript - 如何使用 Javascript 允许进入下一页
- algorithm - 如何对两个字符串应用转换以反转字典比较的结果?
- reactjs - 在 App.js 中出现奇怪的错误“')' expected.ts(1005)”
- c# - 如何在asp.net核心的startup.cs文件的配置方法中更改范围服务的属性值