我想生成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)
以这种方式制作的阵列是否已经是唯一的(如果是这样,我该如何检查)?如果没有,我如何修改我的代码,以便获得独特的数组?
答案 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()进行成员资格检查比数组更快。