使用基于条件的重复循环?

时间:2017-11-10 02:29:46

标签: python python-3.x

我不知道如何查看我正在尝试做的事情,因为我现在只能用非专业人的术语来描述它。基本上我认为我需要做的是找到一种方法来循环调用循环多次,但嵌套。我试图为骰子滚动模拟器这样做有趣,但我遇到的问题是没有硬编码。这就是我所拥有的:

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打印出每个组合的一行以及组合被滚动的次数。

2 个答案:

答案 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})