ya-vitaliy
@ya-vitaliy
Верстаю... + wordpress и пробую Laravel

Как подобрать 5 рандомных чисел если есть только срерднеарифметическое этих чисел?

Как подобрать 5 рандомных чисел если есть только срерднеарифметическое этих чисел, причем эти рандомные числа должны быть в определенном диапазоне в моем случаи от 60 до 100?
Суть в том что у меня есть рейтинг, который выглядит так:
5bdacf213d333672175777.png
Но проблема в том что у меня сейчас есть только среднеарифметическое число этого рейтинга (в данном случаи число 89), а тех чисел из которых это среднеарифметическое было сформировано нет, (так получилось, просто раньше этот рейтинг выглядит по другому, и он состоял только из одного числа). И сейчас есть задача добавить в этот рейтинг значения из которых в итоге должно сформироваться среднеарифметическое, которое у нас уже есть, и которое меняться не должно, но есть условие значения эти должны быть рандомные из диапазона от 60 до 100. Надеюсь понятно. Подскажите, может есть какая-то готовая формула, по которой можно вычислить эти значения?

Update: Всем спасибо, кто принял участие в решении задачи. Мне больше всего подошло решение GavriKos, хотя и другие тоже не плохие. Удачи всем!!!
  • Вопрос задан
  • 840 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Все 5 чисел делаете равными 89. Далее берете 2 любых числа из этих пяти. Одно увеличиваете на n, другое уменьшаете. Важно подобрать n случайным образом, но так чтобы при увеличении/уменьшении числа не вышли за диапазоны (что в целом тоже просто). Повторяете все вот это столько раз сколько хотите.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@imhuman
Генерируете число из диапазона 60-100, потом высчитываете ему пару, с условием, что среднее арифметическое пары чисел было близко к целевому (ввести какой-то коэффициент отклонения X). Потом еще пару чисел по тому же принципу, и последнее число высчитываете как вам советовал Сергей Тихонов . На серии экспериментов подбираете X, чтоб числа казались случайными и в тоже время не было выбросов за предел 60-100 у последнего 5го числа. Как-то так можно попытаться.
Ответ написан
Комментировать
@x_dmitry_x
import random

def get_randoms(n, avg, min_val, max_val, repeats=20):
    result = [avg] * n
    for i in range(repeats):
        i1, i2 = random.sample(range(n), 2) # выбираем 2 случайных индекса
        v1, v2 = (result[i1], result[i2]) 
        max_delta = min(v1 - min_val, max_val - v2)
        rand_delta = random.randint(0, max_delta)
        v1 -= rand_delta
        v2 += rand_delta
        result[i1] = v1
        result[i2] = v2

    return result

randoms = get_randoms(5, 89, 60, 100)
print(randoms, sum(randoms) / 5) # [95, 71, 98, 92, 89] 89.0

randoms = get_randoms(5, 89, 60, 100, 50)
print(randoms, sum(randoms) / 5) # [95, 97, 75, 81, 97] 89.0
Ответ написан
@dmshar
Извините, но вынужден вставить ложку дегтя в вашу бочку меда.
Дело в том, что операция "восстановления по среднему" - абсолютно бессмысленна семантически. Т.е. "восстановленные" данные нельзя использовать ни для какого анализа. Категорически и абсольютно.
Другими словами, реальные "прошлые" данные с которыми можно работать и извлекать из них осмысленную информацию - ну например, смотреть, как они изменяются во времени - как было среднее, так и осталось. Все восстановленные данные для такого - и никакого другого анализа - не годятся. Любая такая попытка - явная фальсификация.
Тогда вопрос - а зачем их "восстанавливать"? Честнее просто указать -"данные недоступны".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы