【问题标题】:generating random list of given numbers with limitations and certain length with python使用python生成具有限制和一定长度的给定数字的随机列表
【发布时间】:2020-04-05 22:16:33
【问题描述】:

我想在这些条件下生成一个随机 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)

【问题讨论】:

    标签: python arrays numpy matrix random


    【解决方案1】:

    在这种情况下,很容易创建所有可能的此类行的列表(只有 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])
    

    【讨论】:

    • 如果我想生成所有可能的矩阵怎么办?
    • SanaNazari 要生成所有可能的矩阵,您只需遍历 16 行中每一行的所有可能行。虽然有 504^16 个可能的矩阵,大约是 10^43,所以不可能用当前的计算机生成它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多