如何生成包含随机唯一数字的固定大小的二维数组(Random.Sample)
How to generate a 2D array of fixed size containing Random Unique Numbers (with Random.Sample)
我知道我可以使用 Random.Sample 在定义的数字范围内创建一个唯一随机数数组。
我需要做的基本上是创建一个 5 行和 5 列的二维数组,每个索引将包含一对两个数字。但是,所有25对在整个二维数组中必须是唯一的,数字范围是0-4(共5个数字,所以所有可能的对也是 5x5,即 25)
也就是说,一个可能的二维数组可以是,
Row 1 -> [[0,1], [0,2], [0,3], [1,0], [2,0]]
Row 2 -> [[0,4], [1,1], [1,2], [2,1], [3,0]]
Row 3 -> [[1,3], [1,4], [4,0], [4,1], [3,1]]
Row 4 -> [[2,2], [2,4], [2,3], [4,2], [3,2]]
Row 5 -> [[4,3], [3,3], [4,4], [3,4], [0,0]]
我已经尝试过各种方法来做到这一点,但我无法达到要求的结果。我如何使用 Random.Sample
函数执行此操作?
基础Python解法:
from random import shuffle
n = 5
#create all combinations of index values
l = [[i, j] for i in range(n) for j in range(n)]
#shuffle the list
shuffle(l)
#subdivide into chunks
res = [l[i:i+n] for i in range(0, n**2, n)]
print(res)
示例输出:
[[[0, 2], [3, 3], [4, 3], [4, 0], [3, 4]], [[1, 0], [0, 4], [0, 1], [4, 4], [2, 1]], [[0, 0], [2, 3], [2, 2], [2, 0], [1, 1]], [[1, 2], [3, 0], [4, 1], [3, 1], [2, 4]], [[0, 3], [1, 4], [1, 3], [3, 2], [4, 2]]]
使用 set
生成所需数量的唯一对的另一种方法。
from random import randrange
pairs = set()
while len(pairs) < 25:
pair = randrange(5), randrange(5)
pairs.add(pair)
pairs = list(pairs)
array = [pairs[i: i+5] for i in range(0, 25, 5)]
for i, row in enumerate(array, start=1):
print(f'row {i} -> {row}')
结果:
row 1 -> [(0, 0), (3, 1), (1, 1), (0, 2), (3, 3)]
row 2 -> [(1, 3), (2, 4), (0, 4), (1, 0), (4, 0)]
row 3 -> [(2, 0), (1, 2), (4, 2), (3, 4), (2, 2)]
row 4 -> [(1, 4), (4, 4), (3, 0), (4, 1), (2, 1)]
row 5 -> [(0, 1), (3, 2), (4, 3), (2, 3), (0, 3)]
我知道我可以使用 Random.Sample 在定义的数字范围内创建一个唯一随机数数组。
我需要做的基本上是创建一个 5 行和 5 列的二维数组,每个索引将包含一对两个数字。但是,所有25对在整个二维数组中必须是唯一的,数字范围是0-4(共5个数字,所以所有可能的对也是 5x5,即 25)
也就是说,一个可能的二维数组可以是,
Row 1 -> [[0,1], [0,2], [0,3], [1,0], [2,0]]
Row 2 -> [[0,4], [1,1], [1,2], [2,1], [3,0]]
Row 3 -> [[1,3], [1,4], [4,0], [4,1], [3,1]]
Row 4 -> [[2,2], [2,4], [2,3], [4,2], [3,2]]
Row 5 -> [[4,3], [3,3], [4,4], [3,4], [0,0]]
我已经尝试过各种方法来做到这一点,但我无法达到要求的结果。我如何使用 Random.Sample
函数执行此操作?
基础Python解法:
from random import shuffle
n = 5
#create all combinations of index values
l = [[i, j] for i in range(n) for j in range(n)]
#shuffle the list
shuffle(l)
#subdivide into chunks
res = [l[i:i+n] for i in range(0, n**2, n)]
print(res)
示例输出:
[[[0, 2], [3, 3], [4, 3], [4, 0], [3, 4]], [[1, 0], [0, 4], [0, 1], [4, 4], [2, 1]], [[0, 0], [2, 3], [2, 2], [2, 0], [1, 1]], [[1, 2], [3, 0], [4, 1], [3, 1], [2, 4]], [[0, 3], [1, 4], [1, 3], [3, 2], [4, 2]]]
使用 set
生成所需数量的唯一对的另一种方法。
from random import randrange
pairs = set()
while len(pairs) < 25:
pair = randrange(5), randrange(5)
pairs.add(pair)
pairs = list(pairs)
array = [pairs[i: i+5] for i in range(0, 25, 5)]
for i, row in enumerate(array, start=1):
print(f'row {i} -> {row}')
结果:
row 1 -> [(0, 0), (3, 1), (1, 1), (0, 2), (3, 3)]
row 2 -> [(1, 3), (2, 4), (0, 4), (1, 0), (4, 0)]
row 3 -> [(2, 0), (1, 2), (4, 2), (3, 4), (2, 2)]
row 4 -> [(1, 4), (4, 4), (3, 0), (4, 1), (2, 1)]
row 5 -> [(0, 1), (3, 2), (4, 3), (2, 3), (0, 3)]