在python中生成唯一的随机二进制数组

时间:2018-05-02 23:24:52

标签: python arrays random binary

我想生成200个大小为30的随机二进制数组,但我需要它们都是唯一的!我用来跟随生成数组:

import numpy as np

parents = []
for i in range(200):
    parents.append(np.random.choice([0, 1], size=(30)))
parents = np.vstack(parents)

以这种方式制作的阵列是否已经是唯一的(如果是这样,我该如何检查)?如果没有,我如何修改我的代码,以便获得独特的数组?

2 个答案:

答案 0 :(得分:3)

它们不是唯一的,因为如果它们是,那么它们每次都不会是随机的。

每次生成新数组时都可以执行快速检查,并确保它是唯一的(对于较大的父数组,使用set lookups而不是数组查找):

parents = []
for i in range(200):
    unique_found = False
    while not unique_found:
        candidate_array = np.random.choice([0, 1], size=(30))
        if not any((candidate_array == x).all() for x in parents):
            unique_found = True
    parents.append(candidate_array)

但是,由于有1,073,741,824个长度为30的唯一二进制数组,因此得到2个或更多重复项的概率为:

1 - (1 - (1 / 1,073,741,824))^(200选择2)= 0.0000185,或每54,000约1次。

所以你可以忽略这个问题。

答案 1 :(得分:2)

鉴于长度足够大,生成两个相等阵列的概率非常低。拒绝抽样将非常快:

import numpy as np

parents = set()
while len(parents) < 200:
    a = tuple(np.random.choice([0, 1], size=(30)))
    if a not in parents: parents.add(a)
parents = np.array([list(x) for x in parents])

而且,使用set()进行成员资格检查比数组更快。