You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python生成行列无重复的4×4随机数网格(类数独)

4×4网格每行每列无重复随机数生成方案

你的需求是生成一个4×4网格,每个单元格赋值0-4之间的随机数,要求每行、每列内的数字均不重复。你当前的代码直接分别给行和列赋值,这会导致行与列的约束冲突(同一单元格被两次赋值),且无法保证同时满足行和列的唯一性。

原问题代码

column_A = [A1, A2, A3, A4]
column_B = [B1, B2, B3, B4]
column_C = [C1, C2, C3, C4]
column_D = [D1, D2, D3, D4]
row_1 = [A1, B1, C1, D1]
row_2 = [A2, B2, C2, D2]
row_3 = [A3, B3, C3, D3]
row_4 = [A4, B4, C4, D4]
all_rows = [row_1, row_2, row_3, row_4]
all_columns = [column_A, column_B, column_C, column_D]


def random_grid():
    for i in range(len(all_rows)):
      all_columns[i] = sample([0, 1, 2, 3, 4], 4)
      all_rows[i] = sample([0, 1, 2, 3, 4], 4)

解决方案:约束式随机生成

以下提供两种可行实现,均能满足每行每列无重复的要求:

方法1:回溯式生成(一次生成符合要求)

在填充单元格时实时检查行和列的唯一性,确保生成过程不违反约束:

import random

def generate_valid_grid():
    grid = [[None for _ in range(4)] for _ in range(4)]
    
    def backtrack(row, col):
        if row == 4:
            return grid
        next_row = row if col < 3 else row + 1
        next_col = col + 1 if col < 3 else 0
        
        # 随机打乱候选数字,保证结果随机性
        candidates = random.sample([0,1,2,3,4], 5)
        for num in candidates:
            # 检查当前行和列是否已有该数字
            row_ok = num not in grid[row]
            col_ok = num not in [grid[r][col] for r in range(4) if grid[r][col] is not None]
            if row_ok and col_ok:
                grid[row][col] = num
                result = backtrack(next_row, next_col)
                if result is not None:
                    return result
            grid[row][col] = None
        return None
    
    return backtrack(0, 0)

# 测试生成
valid_grid = generate_valid_grid()
for row in valid_grid:
    print(row)

方法2:随机生成+验证(简单直观)

先生成每行符合要求的网格,再验证列是否满足唯一性,不满足则重新生成:

import random

def is_valid_grid(grid):
    # 检查所有列是否无重复
    for col in range(4):
        column = [grid[row][col] for row in range(4)]
        if len(set(column)) != 4:
            return False
    return True

def generate_random_grid():
    while True:
        # 生成每行:从0-4中选4个不重复的数
        grid = [random.sample([0,1,2,3,4], 4) for _ in range(4)]
        if is_valid_grid(grid):
            return grid

# 测试生成
valid_grid = generate_random_grid()
for row in valid_grid:
    print(row)

说明

  • 回溯法在生成过程中就满足约束,不会产生无效网格;随机验证法实现简单,适合4×4这种小规模场景。
  • 两种方法生成的网格,每行是0-4中4个不重复的数,每列也保证无重复,完全匹配需求。

内容的提问来源于stack exchange,提问作者Raylhor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:20:33