【发布时间】:2016-02-22 00:42:12
【问题描述】:
假设我有一个 0 的二维数组 (8x8)。我想用预定数量的 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]]
1 的最终位置无关紧要,只要它是随机的(或 Python 允许的随机)。
我的代码在技术上是有效的,但我认为它的效率非常低。我所做的只是将每个数字变为 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
虽然此方法有效,但它似乎是一种迂回的方法。有没有更好(即更有效)的方法来做到这一点?我预计这段代码会运行很多次(如果不是数百万,也有数十万),所以速度是一个问题。
【问题讨论】:
-
先在一个一维数组上做,然后再改成 8X8 形状。
-
使用随机随机播放。根据stackoverflow.com/a/976918/1653571,用 16 个向量填充长度为 8x8 的向量,并将它们打乱