2016-03-26 3 views
2

Для n = 5, две случайные последовательности целых чисел в [0, 2] может выглядеть следующим образом:Numpy: Сформировать 2 последовательности п случайных чисел, без наложений

l1 = [2, 0, 2, 2, 0] 
l2 = [0, 1, 2, 2, 2] 

Я хочу, чтобы убедиться, что l1[i] != l2[i] для всех i , Мой текущий метод (зацикливание по всем значениям и заменяющих наложений) кажется неуклюжим:

n = 5 
sample = np.arange(3) 
l1 = np.random.choice(sample, size=n) 
l2 = np.random.choice(sample, size=n) 
mask = np.ones(sample.size, dtype=bool) 
for i in xrange(n): 
    if l1[i] == l2[i]: 
     mask[l1[i]] = False 
     l2[i] = np.random.choice(sample[mask]) 
     mask[l1[i]] = True 

Есть ли лучший способ сделать это?

ответ

2

Одним из способов было бы вычислить l1, как вы делаете, но затем вычислить набор расстояний или смещения для каждого элемента, и убедитесь, что смещение не может быть 0:

ofs = l2 = np.random.choice(sample[:-1], size=n)+1 

Тогда вам может добавить эти смещения к l1 и обернуть результаты обратно в диапазон:

l2 = (l1 + ofs) % (sample[-1] + 1) 
Смежные вопросы