根据随机选择给列表中的元素赋值



我目前正在尝试为康威的生活游戏编程,并且目前处于我只是试图初始化随机化棋盘的阶段。

我首先创建了一个包含1000个元素的列表,每个元素都包含1000个0(本质上是一个1000x1000的空板)。

将0更新为1的代码如下:

def initialize(board):
numlist=[1,2,3]
for i,v in enumerate(board):
for j,w in enumerate(v):
if random.choice(numlist)==1:
board[i][j]=1
return board
然而,当我在上面提到的空板上运行这个函数时,列表中的每个值都被设置为1。我也试图将其编码如下:
def initialize(board):
for i,v in enumerate(board):
for j,w in enumerate(v):
x=stats.uniform.rvs()
if x<=.33:
board[i][j]=1
return board

我很难理解为什么输出是所有15的列表,而不是板的期望输出,其中~1/3的瓷砖是15。我已经检查了代码很多次,我不明白为什么这个结果总是发生。

我如何完成我提出的目标,即将1000x1000的1/3分配给15 ?任何建议或指导是非常感谢!

我已经确定答案是将列表的列表转换为numpy数组,这立即解决了问题!

错误可能与您传入的原始board有关。如果你的开头是这样的:

board = [[0] * 1000] * 1000

则有1000个对同一列表的引用,而不是1000个不同的列表。您所做的任何修改都是对同一共享列表的修改。

我将初始化板如下:

board = [[random.choice([0, 0, 1]) for _ in range(1000)] for _ in range(1000)]

使用嵌套推导式,内部循环在外部循环中执行多次,为您提供多个唯一列表;这与列表乘法不同,后者只是简单地复制列表的内容。

最新更新