尝试在Python中使用随机数创建数独矩阵

尝试在Python中使用随机数创建数独矩阵,python,Python,我需要创建一个数独模板,并将其全部填充。我需要处理随机数,所以我检查行和列中是否已经存在该数字。问题是,当一个数字在列中重复时,它不会尝试另一个数字,从而得到一个无限循环。有人能帮我吗?记住,我必须处理随机数 import random matrix = [[None for i in range(9)] for j in range(9)] def criarSdk(): for l in range(9): for c in range(9):

我需要创建一个数独模板,并将其全部填充。我需要处理随机数,所以我检查行和列中是否已经存在该数字。问题是,当一个数字在列中重复时,它不会尝试另一个数字,从而得到一个无限循环。有人能帮我吗?记住,我必须处理随机数

import random
matrix = [[None for i in range(9)] for j in range(9)]

def criarSdk():
    for l in range(9):
        for c in range(9):
            if matrix[l][c] is None:
                tmp3 = False
                print("linha l={}, coluna c={}".format(l,c))
                while tmp3 is False:
                    ale = random.randint(1, 9)
                    tmp1 = veriLine(matrix,ale, l)
                    tmp2 = veriCol(matrix,ale, c)
                    tmp3 = tmp1 and tmp2
                    if tmp3 is True:
                        matrix[l][c] = ale

def veriLine(vetor, value, line):
    tmp = True
    for c in range(9):
        if value == vetor[line][c]:
            tmp = False

    return tmp

def veriCol(vetor, value, col):
    tmp = True
    for l in range(9):
        if value == vetor[l][col]:
            tmp = False

    return tmp

criarSdk()
for i in range(9):
    print(matrix[i])

问题不在于代码,而在于算法

如果你像这样填充一个数独,你可能会在一个没有数字可以填充一些空间的情况下结束

考虑这一点:

1 2 3 4 5 6 7 8 9
2 1 5 3 4 7 8 6 x
您可以想象第一行被随机值填充(恰好是有序的),然后第二行上的值也被随机值填充,但是在x中放什么值呢?您不能输入
9
,因为它会在列上发生冲突。但是你也不能放其他的东西,因为其他的东西都已经上线了

在这种情况下,您的代码将无休止地循环,尝试随机数,但它们都无法工作


您需要研究回溯并提出更好的解决方案。请注意,随机选取一个数字的要求并不一定意味着您一直在调用
random.randint()
要获得一个新选项,您还可以从尚未尝试过的一组数字中随机选取。

您的问题不在于代码,而在于算法

如果你像这样填充一个数独,你可能会在一个没有数字可以填充一些空间的情况下结束

考虑这一点:

1 2 3 4 5 6 7 8 9
2 1 5 3 4 7 8 6 x
您可以想象第一行被随机值填充(恰好是有序的),然后第二行上的值也被随机值填充,但是在x中放什么值呢?您不能输入
9
,因为它会在列上发生冲突。但是你也不能放其他的东西,因为其他的东西都已经上线了

在这种情况下,您的代码将无休止地循环,尝试随机数,但它们都无法工作


您需要研究回溯并提出更好的解决方案。请注意,随机选择一个数字的要求并不一定意味着你一直在调用
random.randint()
对于一个新选项,你也可以从一组尚未尝试过的数字中随机选择。

嘿,我在想,我可以创建一个从1到9的数字数组;如果矩阵为None,则对数组使用random.shuffle,并仅验证矩阵中的colunm和3 x 3。如果数字重复,代码将重新启动此过程并重试。这有可能吗?这当然有可能,但如果你的最终目标是填充一个9x9数独,这并不能解决你的问题,因为你仍然会生成在某些情况下无法组合的数组。除了更好的策略(有一些关于数独策略的书)更复杂的编码之外,基本的暴力回溯可能是最简单的方法。实际上已经有几十种解决方案了,如果你想不出自己的解决方案——试着编写自己的算法实现,就像嘿,我在想,我可以创建一个从1到9的数字数组;如果矩阵为None,则对数组使用random.shuffle,并仅验证矩阵中的colunm和3 x 3。如果数字重复,代码将重新启动此过程并重试。这有可能吗?这当然有可能,但如果你的最终目标是填充一个9x9数独,这并不能解决你的问题,因为你仍然会生成在某些情况下无法组合的数组。除了更好的策略(有一些关于数独策略的书)更复杂的编码之外,基本的暴力回溯可能是最简单的方法。事实上,已经有几十种解决方案了,如果你想不出自己的解决方案——试着编写自己的算法实现,比如