Python – 随机填充设置数为1的2D数组

假设我有一个0的二维数组(8×8).我想用预定数量的1填充这个数组,但是以随机的方式填充.例如,假设我想在网格中随机放置16个1,导致如下所示:

[[0, 0, 0, 1, 0, 0, 1, 0],
 [1, 0, 0, 0, 0, 0, 0, 1],
 [0, 0, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0],
 [0, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 0, 1, 1, 0, 0],
 [0, 1, 0, 0, 0, 1, 0, 0],
 [0, 1, 1, 0, 0, 0, 0, 1]]

只要它是随机的(或者像Python允许的那样随机),1的最终位置无关紧要.

我的代码在技术上有效,但我认为它的效率极低.我所做的只是将每个数字的概率设置为1到n / s,其中n是所需的1的数量,s是网格的大小(即元素的数量),然后我检查是否添加了正确的1的数量.这是代码(Python 2.7):

length = 8
numOnes = 16
while True:
    board = [[(random.random() < float(numOnes)/(length**2))*1 for x in xrange(length)] for x in xrange(length)]
    if sum([subarr.count(1) for subarr in board]) == 16:
        break
print board

虽然这有效,但它似乎是一种迂回的方法.这样做有更好(即更有效)的方法吗?我预见很多次运行这个代码(数十万甚至数百万),所以速度是一个问题.

最佳答案
要么改变16个1和48个0的列表:

board = [1]*16 + 48*[0]
random.shuffle(board)
board = [board[i:i+8] for i in xrange(0, 64, 8)]

或用0填充董事会并挑选16个职位的随机样本,将1分投入:

board = [[0]*8 for i in xrange(8)]
for pos in random.sample(xrange(64), 16):
    board[pos//8][pos%8] = 1

转载注明原文:Python – 随机填充设置数为1的2D数组 - 代码日志