у функции не входе параметры
ф(а, б, ц, д)
а — до какого числа генерировать
б — сколько чисел
ц — минимальное число
д — максимальное число.
собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение.
забыл написать — чтоб их сумма была равна а
Первая итерация — заполняешь массив b чисел. Каждое из них равно a/b — в сумме а
Вторая итерация — те числа что меньше минимума рандомно увеличиваешь на какую-то дельта и столько же раз те числа что больше максимума уменьшаешь на эту же дельта
повторяй втроую итерацию пока все не станут в нужном диапазоне. Сумма — по-прежнему а
Третья итерация — уменьшай одно и увеличивай другое на рандомный шаг
повторяй третью итерацию миллион раз (с остслеживанием чтоб не вылезло за диапазон). Сумма — по-прежнему а
Н>Первая итерация — заполняешь массив b чисел. Каждое из них равно a/b — в сумме а Н>Вторая итерация — те числа что меньше минимума рандомно увеличиваешь на какую-то дельта и столько же раз те числа что больше максимума уменьшаешь на эту же дельта Н>повторяй втроую итерацию пока все не станут в нужном диапазоне. Сумма — по-прежнему а
Н>Третья итерация — уменьшай одно и увеличивай другое на рандомный шаг Н>повторяй третью итерацию миллион раз (с остслеживанием чтоб не вылезло за диапазон). Сумма — по-прежнему а
так ты нормального распределия не достигнешь. кроме того, в задаче заявлено, что это решается за один проход
Здравствуйте, undo75, Вы писали:
U>у функции не входе параметры U>ф(а, б, ц, д) U>а — до какого числа генерировать U>б — сколько чисел U>ц — минимальное число U>д — максимальное число. U>собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение. U>забыл написать — чтоб их сумма была равна а
постановка задачи не корректная
нормальное распределение задаётся средним и дисперсией и не имеет минимального и максимального значения.
если же вы выбираеет из диапазона то можете огрести:
например что должна вернуть ф(0,1,2,3)
_>постановка задачи не корректная _>нормальное распределение задаётся средним и дисперсией и не имеет минимального и максимального значения.
_>если же вы выбираеет из диапазона то можете огрести: _>например что должна вернуть ф(0,1,2,3)
не придирайся. я по памяти )
валидцию тоже опустим. общее решение. как мне утверждалось оно есть
Здравствуйте, kov_serg, Вы писали:
_>постановка задачи не корректная _>нормальное распределение задаётся средним и дисперсией и не имеет минимального и максимального значения. _>если же вы выбираеет из диапазона то можете огрести: _>например что должна вернуть ф(0,1,2,3)
Я думаю, тут речь идет о равномерном распределении.
Здравствуйте, undo75, Вы писали:
U>у функции не входе параметры U>ф(а, б, ц, д) U>а — до какого числа генерировать U>б — сколько чисел U>ц — минимальное число U>д — максимальное число. U>собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение. U>забыл написать — чтоб их сумма была равна а
Так набросок: представим себе отрезок разделенный точками на б отрезков, на каждой итерации "шевелим" случайно точки так, что бы два соседних отрезка не вышли за ц и д. Повторить для каждой точки.
Здравствуйте, undo75, Вы писали:
U>у функции не входе параметры U>ф(а, б, ц, д) U>а — до какого числа генерировать U>б — сколько чисел U>ц — минимальное число U>д — максимальное число. U>собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение. U>забыл написать — чтоб их сумма была равна а
Нормальное распределение — всегда на бесконечной оси. Никаких min/max, только матожидание и дисперсия.
Решение: вернуть массив констант [a/b]*b, при условии a/b>=с и a/b<=d, иначе решения нет. Это нормально распределенные величины (с нулевой дисперсией, но дисперсию нам не задавали).
При ненулевой дисперсии и конечных с и d — решение невозможно.
Если нужно распределение с равными дисперсиями, и линейным ограничениями (сумма равна заданной), но без ограничений min/max,
то генерируем по формуле:
где:
F(A,D) — нормальная случайная величина, с ожиданием A и дисперсией D.
D_1 — целевая дисперсия.
f(i, b) — функция, вывести которую оставляем автору самостоятельно.
вот смотри. чат бота напряг. кстати сходу в режиме диалога предложил первый вариант.
но вариант не устроил. мне сказали, что возможно решить задачу за одну итерацию. ну в смысле кучу раз проходов не делать. это меня обескуражило. поэтому и спрашиваю )
Генерация случайных чисел с нормальным распределением, дающих в сумме заданное число, немного сложнее, чем простая генерация случайных чисел. Прямого способа получить идеально нормальное распределение при заданной сумме нет, но можно использовать приближенные методы.
Вот несколько подходов:
Метод 1: Итеративный подход с корректировкой
Этот метод генерирует случайные числа с нормальным распределением и затем корректирует их, чтобы сумма была равна целевому значению.
import numpy as np
def generate_numbers(target_sum, num_numbers):
"""Генерирует случайные числа с приблизительно нормальным распределением,
сумма которых равна target_sum.
"""
# Корректируем сумму, чтобы точно соответствовать target_sum
diff = target_sum — np.sum(numbers)
correction = diff / num_numbers
numbers += correction
return numbers
# Пример использования:
target_sum = 100
num_numbers = 5
result = generate_numbers(target_sum, num_numbers)
print(result)
print(np.sum(result)) # Проверка суммы
Этот код использует numpy.random.normal для генерации чисел с нормальным распределением. loc устанавливает среднее значение (ожидаемое значение каждого числа), а scale — стандартное отклонение (дисперсию). Подбор scale важен для получения более "нормального" распределения. В данном примере используется эмпирическое значение target_sum / (num_numbers * 3), но его можно настраивать. Коррекция гарантирует, что сумма будет точно равна target_sum. Обратите внимание, что из-за корректировки распределение будет лишь *приближенно* нормальным.
Метод 2: Использование метода обратной функции
Более сложный, но потенциально дающий более точное нормальное распределение. Этот метод требует знания обратной функции кумулятивной функции распределения (CDF) для нормального распределения.
Метод 3: Дискретное нормальное распределение
Если вы работаете с целыми числами, можно использовать дискретное приближение нормального распределения.
Выбор метода:
Для большинства задач метод 1 достаточно хорош. Методы 2 и 3 требуют большего математического понимания и реализации. Выбор метода зависит от требуемой точности и сложности реализации. Экспериментируйте с scale в методе 1, чтобы настроить степень "нормальности" распределения. Чем больше num_numbers, тем лучше будет приближение к нормальному распределению.
Важное замечание: Полностью нормальное распределение при фиксированной сумме невозможно получить, так как ограничение на сумму накладывает зависимость между числами. Эти методы обеспечивают *приближение* к нормальному распределению.
Здравствуйте, undo75, Вы писали:
U>вот смотри. чат бота напряг. кстати сходу в режиме диалога предложил первый вариант. U>но вариант не устроил. мне сказали, что возможно решить задачу за одну итерацию. ну в смысле кучу раз проходов не делать. это меня обескуражило. поэтому и спрашиваю )
Формула, которую я записал, и есть однопроходная, причем дающая минимум корелляций.
Формула для f — корень из отношения полиномов. Просто лень выводить наночь глядя.
U>
U>Генерация случайных чисел с нормальным распределением, дающих в сумме заданное число, немного сложнее, чем простая генерация случайных чисел. Прямого способа получить идеально нормальное распределение при заданной сумме нет, но можно использовать приближенные методы.
U>Вот несколько подходов:
U>Метод 1: Итеративный подход с корректировкой
U>Этот метод генерирует случайные числа с нормальным распределением и затем корректирует их, чтобы сумма была равна целевому значению.
U>import numpy as np
U>def generate_numbers(target_sum, num_numbers):
U> """Генерирует случайные числа с приблизительно нормальным распределением,
U> сумма которых равна target_sum.
U> """
U>Этот код использует numpy.random.normal для генерации чисел с нормальным распределением. loc устанавливает среднее значение (ожидаемое значение каждого числа), а scale — стандартное отклонение (дисперсию). Подбор scale важен для получения более "нормального" распределения. В данном примере используется эмпирическое значение target_sum / (num_numbers * 3), но его можно настраивать. Коррекция гарантирует, что сумма будет точно равна target_sum. Обратите внимание, что из-за корректировки распределение будет лишь *приближенно* нормальным.
U>Метод 2: Использование метода обратной функции
U>Более сложный, но потенциально дающий более точное нормальное распределение. Этот метод требует знания обратной функции кумулятивной функции распределения (CDF) для нормального распределения.
U>Метод 3: Дискретное нормальное распределение
U>Если вы работаете с целыми числами, можно использовать дискретное приближение нормального распределения.
U>Выбор метода:
U>Для большинства задач метод 1 достаточно хорош. Методы 2 и 3 требуют большего математического понимания и реализации. Выбор метода зависит от требуемой точности и сложности реализации. Экспериментируйте с scale в методе 1, чтобы настроить степень "нормальности" распределения. Чем больше num_numbers, тем лучше будет приближение к нормальному распределению.
U>Важное замечание: Полностью нормальное распределение при фиксированной сумме невозможно получить, так как ограничение на сумму накладывает зависимость между числами. Эти методы обеспечивают *приближение* к нормальному распределению.
Метод 1 — генерирует нормально распределенные величины, но не с той дисперсией, какую заказывает. Не независимые, конечно.
Метод 2 — она расказывает, как сгенерировать нормально распределенную величину. Одну.
Метод 3 — совсем другая задача.
Последняя фраза — просто враньё. Невозможно получить независимые нормально распределенные величины. Зависимое — в легкую:
Например, для b=2 Первое число — нормально распеределенное, второе из алгебраической формулы для суммы. Обе велечины, очевидно, окажутся распределены нормально.
SD>Определись сперва, тебе нормальное или равномерное распределение? Если равномерное, задача тривиальная, а если нормальное, то решения нет.
мне сформулировали именно про нормальное распределение. тоже думал о равномерно. и как сказали — задача из жизни и решение есть.
кстати чатбот Фигню сказал?