Случайный числовой массив в порядке - PullRequest
0 голосов
/ 15 октября 2018

У меня есть метод случайной выборки, как показано ниже:

def costum_random_sample(size):
    randomList = []
    counter = 0
    last_n = -1
    while(size != counter):
        n = random.random()
        if abs(n - last_n) < 0.05:
            continue
        else:
            randomList.append(n)
            counter += 1
            last_n = n

    return np.array(randomList) 

Результатом является массив ([0.50146945, 0.17442673, 0.60011469, 0.13501798]), подобный этому.Теперь я хочу изменить его, чтобы он приводил к массиву лайков в порядке возрастания.Sort () не работает в этом случае, так как она меняет порядок моего массива после его генерации, и логика между каждым числом изменяется.Я хочу, чтобы это случайное число в списке по порядку, таким образом, он мог бы сохранить логику в последовательности номеров.Как я могу это сделать?

1 Ответ

0 голосов
/ 15 октября 2018

Если ваши массивы короткие, вы можете просто сгенерировать весь массив, отсортировать его, отклонить и восстановить до тех пор, пока ограничение нарушено.

bad = True
while bad:
    arr = np.sort(np.random.rand(size))
    bad = np.any(np.ediff1d(arr) < 0.05)

Если size слишком велико,конфликты будут слишком многочисленными, и это будет длиться вечно, поэтому используйте его, только если есть разумная вероятность, что соответствующий массив будет сгенерирован случайным образом.Обратите внимание, что если size > 20 нет массива, который бы соответствовал критериям, превращая его в бесконечный цикл.

Другой подход мог бы состоять в том, чтобы сгенерировать и отсортировать массив, как указано выше, найти пары несоответствующих элементов,затем подтолкнуть элементы массива, увеличив расстояние между некомфортными парами и равномерно вычтя эту разницу из других мест.Это не может застрять в бесконечном цикле, но имеет немного больше математики и изгибает равномерное распределение (хотя я не могу сказать вам сколько).

РЕДАКТИРОВАТЬ После размышленийнемного, есть намного лучший способ.По сути, вам нужен массив с интервалом, в котором есть фиксированная прокладка и немного дополнительной случайности между каждым элементом:

random start space
[element1]
0.05 spacer
some more space
[element2]
0.05 spacer
some more space
[element3]
random end space

Все пространство необходимо добавить до 1. Однако часть этого пространствафиксированный ((size - 1) * 0.05);поэтому, если мы уберем фиксированные проставки, у нас будет наш «космический бюджет», чтобы распределить между нашим началом, концом и случайным пространством.Таким образом, мы генерируем случайное пространство, а затем немного пробиваем его, чтобы он соответствовал нашему космическому бюджету.Затем добавьте фиксированные разделители, и накопленная сумма даст нам окончательный массив (и дополнительный 1.0 в конце, который мы отрубим).

space_budget = 1 - (size - 1) * 0.05
space = np.random.rand(size + 1)
space *= space_budget / np.sum(space)
space[1:-1] += 0.05
arr = np.cumsum(space)[:-1]

Для size = 21 вы получите точноодно решение каждый раз, так как space_budget равно нулю.При большем size вы начинаете выходить за пределы диапазона 0 ... 1, поскольку математически невозможно вставить в этот интервал более 21 0,05 проставок.

...