Вы могли бы сделать что-то вроде этого:
import random
def generate_list_min_threshold(size=1000, threshold=0.01, min_value=-10, max_value=10, seed=1):
random.seed(seed)
ret = []
while len(ret) < size:
candidate = random.uniform(min_value,max_value) # changed based on comment from Błotosmętek
if all(abs(candidate-value) > threshold for value in ret):
ret.append(candidate)
return ret
Очевидно, что при этом делается попытка равномерной выборки значений в [min_value, max_value]
, и может даже не быть действительного числа для добавления (в зависимости от конфигурации порога). Для повышения производительности вы можете рассмотреть вопрос об условном распределении, учитывая ваши текущие элементы в списке.
Дополнительное предложение разбить массы вероятности и выбрать только действительных кандидатов по рекурсии:
def sample_min_threshold(size=10000, min_value=-10000, max_value=10000, threshold=0.01):
if size == 0:
return []
if (max_value-min_value)/threshold < size:
raise ValueError("No valid configuration.", size, (max_value-min_value)/threshold)
value = random.uniform(min_value, max_value)
mass_left = (value-min_value)/(max_value-min_value)
mass_right = 1 - mass_left
n_left = math.floor(mass_left*size)
n_right = math.floor(mass_right*size)
return (sample_min_threshold(size=n_left, min_value=min_value, max_value=value-threshold) +
[value] +
sample_min_threshold(size=n_right, min_value=value+threshold, max_value=max_value))
edit: добавлена проверка наличия действительной конфигурации для исследования.