Как получить случайный индекс массива без текущего idx? - PullRequest
0 голосов
/ 05 апреля 2020

Я перебираю список (массив numpy с одним измерением, чтобы быть точным), и мне нужно выбрать индекс из этого списка, который является случайным и отличается от текущего итератора.

Самая важная вещь - это постоянная и равная вероятность во всем диапазоне.

list = ['a','b','c','d']
for idx , e in enumerate(list):
  return random.randrange(len(list)-1) # but without possibility of geting idx

- EDIT - не сработает:

    x = np.array([1,2,3,4])
    for idx, e in enumerate(x):
        l = list(range(0, len(x)))
        l.pop(idx)
        res = random.choice(l)
        print(idx, res)

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

В зависимости от размера списка вероятность случайного попадания в idx может быть достаточно малой. Поэтому я обычно делаю что-то вроде этого:

def randrange(n, without=None):
    while True:
        s = random.randrange(n)
        if s != without:
            return s

Чтобы использовать его, просто замените ваш оператор возврата на return randrange(len(list)-1, idx)

0 голосов
/ 05 апреля 2020

Что если вы добавите оператор if, чтобы проверить, отличается ли полученное вами случайное число от итератора?

import random

list1 = ['a','b','c','d']
for idx, e in enumerate(list1):
   randnum = random.randrange(len(list1)-1)
if randnum != idx:
    return randnum

Еще один совет: поскольку библиотека list зарезервирована python. лучше не использовать его в качестве имени переменной.

0 голосов
/ 05 апреля 2020

Вы можете попробовать использовать

list = ['a', 'b', 'c', 'd']
for idx, e in enumerate(list):
    temp = math.randrange(0, len(list)) # You would use -1, if it was randint()
    while temp == idx:
        temp = math.randrange(0, len(list))
    return temp
...