Кажется, это проблема, связанная с целочисленным программированием.Его можно решить относительно эффективно, используя стратегию динамического программирования, которая поддерживает инвариант для меньших подзадач и объединяет эти подзадачи в окончательное решение.Вот высокоуровневый алгоритм, который возвращает вас к вашей цели:
1) Начните со случайного начального числа, x_1 между 0,7
2) Теперь выполните следующие тривремена (i = 2, 3, 4):
3) Найдите минимально возможное следующее число.Чтобы получить в среднем 5 для ваших пяти чисел, ваша целевая сумма для всех пяти - 25. Поэтому вам нужно убедиться, что вы не лишаете себя возможности достичь 25 вообще.Итак, пусть min_i + 1 определяет наименьшее число 0,7, так что сумма всех x_i на данный момент плюс min_i + 1 * (5-i)> = 25.
Пример: скажем, i = 2 и ваши числа до сих пор были 4 и 5. Тогда минимально допустимое третье число min_3 равно 6. Сумма до сих пор составляет 9 и 5-i = 3. 9 + 3 * 6 = 27> =25 и 9 + 3 * 5 = 24 <25. Это означает, что если вы выбрали 5 в качестве min_3, вы больше не сможете достичь своей цели в сумме 25. </p>
4) Выберите x_i+1 как случайное число между min_i + 1 и 7.
5) Наконец, выберите x_5 как 25 - сумма x_1..x_5.Выведите x_1 до x_5.
Пример для всего алгоритма:
Пусть x_1 = 6.
=> min_2 = 5, сумма = 6
Пусть x_2 = 5.
=> min_3 = 5, сумма = 11
Пусть x_3 = 7.
=> min_4 = 4, сумма = 18
Пусть x_4 = 5
=> sum = 23
=> x_5 = 2 (= 25 - 23)
Выход: [6, 5,7, 5, 2], который действительно имеет среднее значение 5.
Теперь этот алгоритм будет давать очень смещенный вывод, если вы хотите, чтобы он появлялся более случайным образом, просто служил перестановкой конечного результатаНапример, в нашем примере вы могли бы вместо этого вывести [5, 7, 2, 5, 6].
Это не должно быть проблемой для реализации этого в Javascript, и его можно легко адаптировать к другим возможным диапазонам для x_i.и общее среднее.Просто обязательно измените целевую сумму на n * avg, если ваш конечный размер выборки должен быть n со средним значением avg.