Il suffit de créer une grille "de base", où deux lignes ou colonnes ne sont pas identiques. Par exemple, pour une grille de taille 4x4, la ligne de base serait :
[[1, 2, 3, 4],
[4, 1, 2, 3],
[3, 4, 1, 2],
[2, 3, 4, 1]]
Puis mélangez les lignes, puis mélangez les colonnes.
Du pur python :
random.shuffle
ne mélange que les éléments de la liste que vous avez transmise. Pour mélanger les colonnes, vous devrez transposer la liste des listes de sorte que le premier axe regroupe les éléments suivants colonnes au lieu de rangs.
import random
def random_grid(size=4):
r = list(range(1, size+1))
baseline = [r[-n:] + r[:-n] for n in range(size)]
random.shuffle(baseline)
transpose = [list(col) for col in zip(*baseline)]
random.shuffle(transpose)
return transpose
Utilisation de numpy :
np.random.shuffle
ne mélange que le premier axe, nous transposons donc le tableau avant de le mélanger à nouveau.
import numpy as np
def random_grid(size=4):
r = list(range(1, size+1))
baseline = np.array([r[-n:] + r[:-n] for n in range(size)])
np.random.shuffle(baseline)
np.random.shuffle(baseline.T)
return baseline
Maintenant, puisque vous voulez des nombres aléatoires entre 0 y size
Si vous avez besoin d'une grille plus grande d'une ligne et d'une colonne que ce que vous voulez, vous pouvez simplement obtenir une grille plus grande d'une ligne et d'une colonne que ce que vous voulez, soustraire un à chaque élément et rejeter la ligne et la colonne supplémentaires.
Du pur python :
def random_grid_2(size=4):
rgrid = random_grid(size+1)
return [[i - 1 for i in row[:-1]] for row in grid[:-1]]
Numpy :
def random_grid_2(size=4):
rgrid = random_grid(size+1) - 1
return rgrid[:-1, :-1]
Bien entendu, cette approche est moins efficace que de le faire en random_grid
en premier lieu, lorsque vous créez la grille, mais j'ai gardé les deux étapes séparées pour vous aider à comprendre ce qui se passe.