Генерация уникальных случайных двоичных массивов в Python - PullRequest
0 голосов
/ 03 мая 2018

Я хочу сгенерировать 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 голосов
/ 03 мая 2018

Они не уникальны, так как если бы они были, то они не были бы равномерно случайными каждый раз.

Вы можете выполнять быструю проверку каждый раз, когда генерируете новый массив, и убедитесь, что он уникален (используя поиск по множеству, а не поиск по массиву для больших родительских массивов):

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.

Так что вы можете не обращать внимания на проблему.

0 голосов
/ 03 мая 2018

Учитывая, что длина достаточно велика, вероятность генерации двух равных массивов очень мала. Отбор проб будет очень быстрым:

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 () для проверки членства выполняется быстрее, чем для массивов.

...