我不知道如何查看我正在尝试做的事情,因为我现在只能用非专业人的术语来描述它。基本上我认为我需要做的是找到一种方法来循环调用循环多次,但嵌套。我试图为骰子滚动模拟器这样做有趣,但我遇到的问题是没有硬编码。这就是我所拥有的:
def rollxdice(dice)->list:
''' Simulates rolling x dice and returns list of values of each die'''
roll_list = []
for i in range(dice):
roll_list.append(randrange(1,7))
return roll_list
def distribution(dice: int, trials:int):
results = []
for i in range(trials):
results.append(rollxdice(dice))
count = 1
while count < 7:
for n in range(1,7):
for j in range(1,7):
print(f'{count}, {n}, {j}')
count +=1
现在,该功能被硬编码为3个骰子。但是,我想让它依赖于dice参数。我也考虑了排列/组合,但我不知道如何摆动它。任何建议/帮助表示赞赏。我意识到while / for循环是垃圾,我更喜欢使用一致的方法。把那里的代码想象成我的头脑风暴。我正在努力让python打印出每个组合的一行以及组合被滚动的次数。
答案 0 :(得分:0)
您可以使用递归函数:
def func(depth, msg = ""):
if depth == 0:
print(msg[:-2]) #delete last 2 character(", ") and print
return;
for i in range(1,7):
func(depth - 1, msg + str(i) + ", ")
func(3)
输出:
1, 1, 1
1, 1, 2
1, 1, 3
...
1, 6, 5
1, 6, 6
2, 1, 1
2, 1, 2
2, 1, 3
...
5, 6, 6
6, 1, 1
6, 1, 2
...
6, 6, 5
6, 6, 6
答案 1 :(得分:0)
您可以使用itertools.product生成循环计数:
>>> list(itertools.product(range(1,4), range(1,4), range(1,4)))
[(1, 1, 1), (1, 1, 2), (1, 1, 3),
(1, 2, 1), (1, 2, 2), (1, 2, 3),
(1, 3, 1), (1, 3, 2), (1, 3, 3),
(2, 1, 1), (2, 1, 2), (2, 1, 3),
(2, 2, 1), (2, 2, 2), (2, 2, 3),
(2, 3, 1), (2, 3, 2), (2, 3, 3),
(3, 1, 1), (3, 1, 2), (3, 1, 3),
(3, 2, 1), (3, 2, 2), (3, 2, 3),
(3, 3, 1), (3, 3, 2), (3, 3, 3)]
如果你想要没有订购的组合,还有combination_with_replacement:
>>> list(itertools.combinations_with_replacement(range(1,4), 3))
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3),
(2, 2, 2), (2, 2, 3), (2, 3, 3), (3, 3, 3)]
结果已排序(因为输入范围已排序,它保持排序),因此您可以在每个卷内对骰子进行排序以获得相同的格式。
顺便说一句,这是使用一些标准库类型的分发测试:
>>> import random, collections
>>> dice=2
>>> sides=2
>>> rolls=100
>>> counts=collections.Counter(
... tuple(sorted(random.randint(1,sides) for die in range(dice)))
... for sample in range(rolls))
>>> counts
Counter({(1, 2): 48, (2, 2): 32, (1, 1): 20})