我对编码非常陌生,所以如果这是一个明显的问题,我深表歉意。我正在尝试创建一些代码来创建符合某些约束的 12 项长数字序列:
我曾尝试解决 2017 年提出的二阶条件问题(Python 中的二阶序列),但我无法让它工作。这是我一直在编辑的代码:
from random import choice
def second_order_random(k,SOC):
n0 = choice(range(1,k+1))
yield n0
n1 = choice(range(1,k+1))
yield n1
while True:
(n0,n1) = (n1,choice(SOC[(n0,n1)]))
yield n1
# dictionary defining valid sequences
SOC = {
(1, 2):(3, 4),
(1, 2):(4, 3),
(1, 3):(2, 4),
(1, 3):(4, 2),
(1, 4):(2, 3),
(1, 4):(3, 2),
(2, 1):(3, 4),
(2, 1):(4, 3),
(2, 3):(1, 4),
(2, 3):(4, 1),
(2, 4):(1, 3),
(2, 4):(3, 1),
(3, 1):(2, 4),
(3, 1):(4, 2),
(3, 2):(1, 4),
(3, 2):(4, 1),
(3, 4):(1, 2),
(3, 4):(2, 1),
(4, 1):(2, 3),
(4, 1):(3, 2),
(4, 2):(1, 3),
(4, 2):(3, 1),
(4, 3):(1, 2),
(4, 3):(2, 1)
}
for n in second_order_random(4, SOC):
print(n)
如果我尝试用任何值替换“k”(我尝试了 4 个尝试并遵循示例),我会得到“SyntaxError:无效语法”输出,否则它什么也不做。我不确定我做错了什么。
你没有说你想使用多少个数字,但对于 12 来说,最小值显然是 3。这是一个简单的回溯算法,它为“下一个”数字创建一个候选列表,排除那些违反要求的数字,并尝试填写列表的其余部分。如果失败,它会回溯并选择下一个可能的候选者:
import random
def fill(src, dst=None):
# print(src, ' >> ', dst)
if not src:
return dst
dst = dst or []
free = list(src)
if len(dst) > 0:
free = [x for x in free if x != dst[-1]]
if len(dst) > 2 and dst[-1] == dst[-3]:
free = [x for x in free if x != dst[-2]]
free = list(set(free))
while free:
n = random.choice(free)
free.remove(n)
src2 = list(src)
src2.remove(n)
dst2 = fill(src2, dst + [n])
if dst2:
return dst2
##
src = [1, 2, 3] * 4
res = fill(src)
print(res)
# for example, [2, 3, 1, 2, 1, 3, 1, 2, 3, 1, 2, 3]