Установите минимальный порог среди элементов списка в python - PullRequest
0 голосов
/ 20 января 2020

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

примерно так: у меня есть список чисел (1.2, 2.7, 0.7, 4.9) и я хочу добавить новый элемент. он должен проверить, имеет ли случайно сгенерированное число минимальное пороговое значение для всех элементов, и если оно не имеет другого порогового значения, и проверить пороговое значение еще раз.

Буду признателен, если вы дадите мне подсказку.

1 Ответ

2 голосов
/ 20 января 2020

Вы могли бы сделать что-то вроде этого:

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: добавлена ​​проверка наличия действительной конфигурации для исследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...