python - 使用 python 生成具有限制和一定长度的给定数字的随机列表

标签 python arrays numpy matrix random

我想在以下条件下生成随机 1 和 0 的二进制矩阵 (16*15):

  • 每行中连续的相同数字不得超过 2 个。
  • 如果每行有连续相等的数字,则最多允许有 3 对。
  • 每行中 1 和 0 的数量必须分别为 8 和 7 或 7 和 8。

我有这段代码用于生成随机列表,但我不知道如何在随机部分添加条件。

import random
import numpy as np

arr_len = 15
num_ones = 8

pattern = np.zeros(arr_len, dtype=int)
idx = np.random.choice(range(arr_len), num_ones, replace=False)
pattern[idx] = 1
print (pattern)

最佳答案

在这种情况下,很容易创建所有可能的此类行的列表(只有 504 个),然后从随机行创建矩阵。

以下代码通过查看每个可能的行来实现此目的,这些行是通过以二进制格式迭代数字 0 到 2^15-1 生成的。然后它检查这三个条件并存储有效的行。为了生成矩阵,它会随机绘制 16 行。

def BinaryString(n):
    s = bin(n)[2:]
    return '0'*(15-len(s)) + s

validRows = []
for binaryNum in range(2**15):
    s = BinaryString(binaryNum)

    #Check Condition 3
    if np.sum([num == '0' for num in s]) not in [7,8]:
        continue

    #Check Condition 1
    hasTriple = False
    for i in range(13):
        if s[i] == s[i+1] and s[i+1] == s[i+2]:
            hasTriple = True
            break
    if hasTriple:
        continue

    #Check Condition 2
    doubles = np.sum([s[i] == s[i+1] for i in range(14)])
    if doubles > 3:
        continue

    #If it is good, append it to the list
    validRows.append([int(i) for i in s])

validRows = np.vstack(validRows)

def CreateMatrix():
    rows = np.random.randint(0,len(validRows),16)
    return np.vstack([validRows[i] for i in rows])

关于python - 使用 python 生成具有限制和一定长度的给定数字的随机列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59305997/

相关文章:

python - 在 Google App Engine 中上传图片

Python 尝试 block 大小

python - 板球跟踪问题

c - 文件/程序范围内的二维数组

python - 忽略 NaN 的 Pandas 聚合

python - 从图像中查找车轮中的辐条总数 - OpenCV (Python)

python - 如何滞后 pandas 系列并创建新的时间滞后数据框?

python - 为什么从 python 中的对象显式子类化会导致全局 NameError 异常?

php - php数组中的echo如何计算每个值

c# - 如何在 .net 的 sql server 中存储 float[]?