如何用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
相关产品推荐
相关产品推荐

