我一直在查看stack,花了几个小时浏览,试图解决这个问题。
任务是:
编写一个名为dicerolls的Python函数来模拟掷骰子。你的函数应该有两个参数:掷骰子的次数k和掷骰子的次数n。该函数应模拟随机滚动k个骰子n次,跟踪每个总面值。然后,它应该返回一个字典,其中包含每个可能的总面值出现的次数。因此,将函数调用为diceroll(k=2,n=1000)应该返回一个类似于:{2:19,3:50,4:82,5:112,6:135,7:174,8:133,9:114,10:75,11:70,12:36}
到目前为止,我已经成功地定义了骰子函数,但我正在努力将k(掷骰数)添加到骰子函数中。到目前为止,我所拥有的:
from numpy import random
def dice():
return random.randint(1, 7)
def diceroll(number_of_times):
counter = {n : 0 for n in range(2, 13)}
for i in range(number_of_times):
first_dice = dice()
second_dice = dice()
total = first_dice + second_dice
counter[total] += 1
return counter
diceroll(1000)
输出: {2: 19, 3: 49, 4: 96, 5: 112, 6: 150, 7: 171, 8: 151, 9: 90, 10: 89, 11: 47, 12:26}
如有任何建议,我们将不胜感激
回答后编辑的代码
import random
def diceroll(k, n, dice_sides=6):
# prepare dictionary with zero values for all possible results
counter = {n : 0 for n in range(k, k*dice_sides + 1)}
# roll all the dice
for i in range(n):
dice_sum = sum(random.choices(range(1, dice_sides + 1), k = k))
counter[dice_sum] += 1
return counter
diceroll(k=2, n=1000)
输出: {2: 20, 3: 49, 4: 91, 5: 116, 6: 140, 7: 138, 8: 173, 9: 112, 10: 72, 11: 65, 12:24}
如果您确实想使用
numpy
,这将更快,但只有在您有大量掷骰和骰子的情况下才会明显更快:您可以使用collectors.counter来跟踪卷。
此外,这可能取决于偏好,但没有理由为random这样简单的东西导入numpy
您可以利用一次提供同一函数的多个卷的随机函数:
random.choices(iterable, k=number of results)
。这比多次滚动1个骰子并将数值相加要快您需要将代码更改为:
输出:
相关问题 更多 >
编程相关推荐