Если ваши массивы короткие, вы можете просто сгенерировать весь массив, отсортировать его, отклонить и восстановить до тех пор, пока ограничение нарушено.
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 проставок.