我有以下代码,我试图在其中形成一个数组"opt"。在这里,我取了三个可能的值 'pos_set' = [1, 2, 3],以类似的方式,我可以扩展它。但是,我只想要任何可能的整数值的通用代码 pos_set。
opt = []
if pos_set == 1:
for j in range(1, n):
opt.append([j])
elif pos_set == 2:
for j in range(1, n):
for k in range(j+1, n):
opt.append([j, k])
elif pos_set == 3:
for j in range(1, n):
for k in range(j+1, n):
for l in range(k+1, n):
opt.append([j, k, l])
为了更清楚起见,我这样做的目的是收集所有可能性,如果你掷一个n面骰子,只要你继续掷更大的值,就继续这样做。
例如,如果你掷出序列 1-2-6-4,在这种情况下,在获得一个较大的数字 6 之后的 4 后,你停止滚动。同样,如果你掷出序列 1-2-6-6,在这种情况下你会得到一个重复的 6,所以你停止,因为它不比你之前的掷骰大。我正在考虑较小或相同数字出现之前的情况,即两种情况下的[1,2,6]。
如果你们能帮助我,我将不胜感激。
您可以使用以下递归函数:
def f(p, n, i=1):
if p == 0:
return [[]]
return [[j, *l] for j in range(i, n) for l in f(p - 1, n, j + 1)]
因此:
print(f(1, 7))
print(f(2, 7))
print(f(3, 7))
输出:
[[1], [2], [3], [4], [5], [6]]
[[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6], [4, 5], [4, 6], [5, 6]]
[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [1, 5, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6], [3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6]]
不确定您是如何解决问题的,您只是关心构建您的 qpos_set
,还是您需要代码方面的帮助来生成满足您目标的实际输出。
这是我编写的代码,它将滚动n面骰子(我只是将其设置为100进行演示(,但这将继续掷另一个骰子并附加其值,直到该数字等于或小于,然后是上一个掷骰子。
我将推迟分解代码,除非您也需要这部分。让我知道!
import random
die = list(range(1, 100))
temp = [0, 1, 2]
winners = []
while temp[1] > temp[0]:
temp[0] = random.randint(1, len(die))
temp[1] = random.randint(1, len(die))
temp[0] = temp[2]
if temp[1] > temp[0]:
winners.append(temp[1])
temp[2] = temp[1]
else:
winners.append(temp[1])
break
print(winners)
有一个内置的解决方案,itertools.portfolios:
In [5]: import itertools
In [6]: list(itertools.combinations(range(1,7), 3))
Out[6]:
[(1, 2, 3),
(1, 2, 4),
(1, 2, 5),
(1, 2, 6),
(1, 3, 4),
(1, 3, 5),
(1, 3, 6),
(1, 4, 5),
(1, 4, 6),
(1, 5, 6),
(2, 3, 4),
(2, 3, 5),
(2, 3, 6),
(2, 4, 5),
(2, 4, 6),
(2, 5, 6),
(3, 4, 5),
(3, 4, 6),
(3, 5, 6),
(4, 5, 6)]