Они не уникальны, так как если бы они были, то они не были бы равномерно случайными каждый раз.
Вы можете выполнять быструю проверку каждый раз, когда генерируете новый массив, и убедитесь, что он уникален (используя поиск по множеству, а не поиск по массиву для больших родительских массивов):
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 или примерно 1 раз на каждые 54 000.
Так что вы можете не обращать внимания на проблему.