如何将python矩阵中的12个随机0变为1

How to change 12 random 0 to 1 in python Matrix

我的程序假设将 python 6x6 矩阵中随机位置的 12 个零更改为 1。 这是我的代码。

from random import randint
M = []
i = 0

for i in range(6):
    M.append([])
    for j in range(6):
        M[i].append(0)

while i < 12:
    index = randint(0,5)
    index2 = randint(0,5)
    if (M[index][index2] == 0):
        M[index][index2] = 1
    i+=1

print(M)

所以我的矩阵在开始时看起来像这样

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

所以我随机选择了一个数组和所选数组中的元素。 问题是每次都会更改不同数量的零。不像我希望他们改变的那样 12。 有谁知道如何解决这个问题?

问题在于 index1index2 这两个索引是随机选择并替换的,因此一对索引可以出现不止一次。这意味着一个值将被设置为 1 两次或更多次。

一个稍微复杂的方法是创建一个包含所有可能索引的列表,然后从中随机选择一组。

from random import randint, sample
import itertools
M = []
i = 0

for i in range(6):
    M.append([])
    for j in range(6):
        M[i].append(0)

indices = list(itertools.product(range(6), range(6))
random_indicies = sample(indices, 12)
for ind in random_indicies:
    if (M[ind[0]][ind[1]] == 0):
        M[ind[0]][ind[1]] = 1
    i+=1

print(M)

这将创建一个列表 indices,其中包含所有可能的索引对。 sample 从中挑选 12 个,不放回,迭代并用在矩阵中。

一种慢得多但实用的方法是继续循环直到 12 个索引设置为 1

from random import randint
M = []
i = 0

for i in range(6):
    M.append([])
    for j in range(6):
        M[i].append(0)

while i < 12:
    index = randint(0,5)
    index2 = randint(0,5)
    if (M[index][index2] == 0):
        M[index][index2] = 1
        i+=1

print(M)

如果 M 中的元素未更改,则直接跳过 i+=1,因此它会一直迭代,直到 M 中的 12 个元素被更改。

您可以创建一个长度为 36 的平面数组,随机选择 12 个索引,将索引处的值更改为 1,然后最后整形为 6x6:

import numpy as np

array = np.zeros(36)
indeces = np.random.choice(np.arange(36), 12, replace = False)
array[indeces] = 1
M = np.reshape(array, (6,6))
print(M)

所以你的代码有两个问题。首先,您在 for 循环中使用变量 i 。到完成 运行ning 时,Python 已存储变量并为其分配值 5。因此,当您 运行 您的 while-loop 时,您是从 5 开始,而不是像您希望的那样从零开始。一个简单的解决方法是使用不同的变量或再次分配 i=0

第二个问题是你的if语句和i+=1。这使您的 while 循环受到重复概率的影响,有 1/36 的机会只有 1 个零变化!在 if 语句中包含 i+=1 语句应该可以解决您的问题。

代码中的两个问题:

  1. 就在 while 循环之前,“i”var 的值是“5”,来自之前的 for 循环
  2. 您应该在 while 循环中递增“i”变量,只有当一个值从 0 变为 1 时

这是代码

from random import randint
M = []
i = 0

for i in range(6):
    M.append([])
    for j in range(6):
        M[i].append(0)

print(M)

i=0
while i < 12:
    index = randint(0,5)
    index2 = randint(0,5)
    if (M[index][index2] == 0):
        M[index][index2] = 1
        i+=1

print(M)

和输出

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