а такая вот задачка
От: undo75  
Дата: 28.01.25 13:07
Оценка:
у функции не входе параметры
ф(а, б, ц, д)
а — до какого числа генерировать
б — сколько чисел
ц — минимальное число
д — максимальное число.
собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение.
забыл написать — чтоб их сумма была равна а
Отредактировано 28.01.2025 13:07 undo75 . Предыдущая версия .
Re: а такая вот задачка
От: Нomunculus Россия  
Дата: 28.01.25 14:15
Оценка:
Здравствуйте, undo75, Вы писали:

Первая итерация — заполняешь массив b чисел. Каждое из них равно a/b — в сумме а
Вторая итерация — те числа что меньше минимума рандомно увеличиваешь на какую-то дельта и столько же раз те числа что больше максимума уменьшаешь на эту же дельта
повторяй втроую итерацию пока все не станут в нужном диапазоне. Сумма — по-прежнему а

Третья итерация — уменьшай одно и увеличивай другое на рандомный шаг
повторяй третью итерацию миллион раз (с остслеживанием чтоб не вылезло за диапазон). Сумма — по-прежнему а
Re[2]: а такая вот задачка
От: undo75  
Дата: 28.01.25 14:58
Оценка:
Н>Первая итерация — заполняешь массив b чисел. Каждое из них равно a/b — в сумме а
Н>Вторая итерация — те числа что меньше минимума рандомно увеличиваешь на какую-то дельта и столько же раз те числа что больше максимума уменьшаешь на эту же дельта
Н>повторяй втроую итерацию пока все не станут в нужном диапазоне. Сумма — по-прежнему а

Н>Третья итерация — уменьшай одно и увеличивай другое на рандомный шаг

Н>повторяй третью итерацию миллион раз (с остслеживанием чтоб не вылезло за диапазон). Сумма — по-прежнему а

так ты нормального распределия не достигнешь. кроме того, в задаче заявлено, что это решается за один проход
Re: а такая вот задачка
От: kov_serg Россия  
Дата: 28.01.25 16:03
Оценка: +1
Здравствуйте, undo75, Вы писали:

U>у функции не входе параметры

U>ф(а, б, ц, д)
U>а — до какого числа генерировать
U>б — сколько чисел
U>ц — минимальное число
U>д — максимальное число.
U>собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение.
U>забыл написать — чтоб их сумма была равна а

постановка задачи не корректная
нормальное распределение задаётся средним и дисперсией и не имеет минимального и максимального значения.

если же вы выбираеет из диапазона то можете огрести:
например что должна вернуть ф(0,1,2,3)
Re[2]: а такая вот задачка
От: undo75  
Дата: 28.01.25 16:45
Оценка:
_>постановка задачи не корректная
_>нормальное распределение задаётся средним и дисперсией и не имеет минимального и максимального значения.

_>если же вы выбираеет из диапазона то можете огрести:

_>например что должна вернуть ф(0,1,2,3)



не придирайся. я по памяти )
валидцию тоже опустим. общее решение. как мне утверждалось оно есть
Re[2]: а такая вот задачка
От: Sharov Россия  
Дата: 28.01.25 19:33
Оценка: +1
Здравствуйте, kov_serg, Вы писали:

_>постановка задачи не корректная

_>нормальное распределение задаётся средним и дисперсией и не имеет минимального и максимального значения.
_>если же вы выбираеет из диапазона то можете огрести:
_>например что должна вернуть ф(0,1,2,3)

Я думаю, тут речь идет о равномерном распределении.
Кодом людям нужно помогать!
Re[3]: а такая вот задачка
От: undo75  
Дата: 28.01.25 20:20
Оценка:
S>Я думаю, тут речь идет о равномерном распределении.


решение сэр?
Re: а такая вот задачка
От: Qulac Россия  
Дата: 28.01.25 21:12
Оценка:
Здравствуйте, undo75, Вы писали:

U>у функции не входе параметры

U>ф(а, б, ц, д)
U>а — до какого числа генерировать
U>б — сколько чисел
U>ц — минимальное число
U>д — максимальное число.
U>собственно задача сгенерировать б случайных чисел, попадающих под критерии ц и д, причем чтоб было нормальное распределение.
U>забыл написать — чтоб их сумма была равна а

Так набросок: представим себе отрезок разделенный точками на б отрезков, на каждой итерации "шевелим" случайно точки так, что бы два соседних отрезка не вышли за ц и д. Повторить для каждой точки.
Программа – это мысли спрессованные в код
Отредактировано 28.01.2025 21:23 Qulac . Предыдущая версия .
Re: а такая вот задачка
От: Chorkov Россия  
Дата: 30.01.25 17:15
Оценка:
Здравствуйте, 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) — функция, вывести которую оставляем автору самостоятельно.
Re[2]: а такая вот задачка
От: undo75  
Дата: 31.01.25 15:43
Оценка:
вот смотри. чат бота напряг. кстати сходу в режиме диалога предложил первый вариант.
но вариант не устроил. мне сказали, что возможно решить задачу за одну итерацию. ну в смысле кучу раз проходов не делать. это меня обескуражило. поэтому и спрашиваю )

Генерация случайных чисел с нормальным распределением, дающих в сумме заданное число, немного сложнее, чем простая генерация случайных чисел. Прямого способа получить идеально нормальное распределение при заданной сумме нет, но можно использовать приближенные методы.

Вот несколько подходов:

Метод 1: Итеративный подход с корректировкой

Этот метод генерирует случайные числа с нормальным распределением и затем корректирует их, чтобы сумма была равна целевому значению.

import numpy as np

def generate_numbers(target_sum, num_numbers):
"""Генерирует случайные числа с приблизительно нормальным распределением,
сумма которых равна target_sum.
"""

numbers = np.random.normal(loc=target_sum / num_numbers, scale=target_sum / (num_numbers * 3), size=num_numbers) # loc — среднее, scale — стандартное отклонение. Подбор scale важен для нормальности распределения

# Корректируем сумму, чтобы точно соответствовать 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, тем лучше будет приближение к нормальному распределению.


Важное замечание: Полностью нормальное распределение при фиксированной сумме невозможно получить, так как ограничение на сумму накладывает зависимость между числами. Эти методы обеспечивают *приближение* к нормальному распределению.

Re[3]: а такая вот задачка
От: Chorkov Россия  
Дата: 31.01.25 18:32
Оценка: +1
Здравствуйте, 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> numbers = np.random.normal(loc=target_sum / num_numbers, scale=target_sum / (num_numbers * 3), size=num_numbers) # loc — среднее, scale — стандартное отклонение. Подбор scale важен для нормальности распределения

U> # Корректируем сумму, чтобы точно соответствовать target_sum
U> diff = target_sum — np.sum(numbers)
U> correction = diff / num_numbers
U> numbers += correction

U> return numbers

U># Пример использования:
U>target_sum = 100
U>num_numbers = 5
U>result = generate_numbers(target_sum, num_numbers)
U>print(result)
U>print(np.sum(result)) # Проверка суммы


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 Первое число — нормально распеределенное, второе из алгебраической формулы для суммы. Обе велечины, очевидно, окажутся распределены нормально.
Re[4]: а такая вот задачка
От: SkyDance Земля  
Дата: 31.01.25 21:35
Оценка:
S>>Я думаю, тут речь идет о равномерном распределении.
U>решение сэр?

Определись сперва, тебе нормальное или равномерное распределение? Если равномерное, задача тривиальная, а если нормальное, то решения нет.
Re[3]: а такая вот задачка
От: kov_serg Россия  
Дата: 31.01.25 21:59
Оценка:
Здравствуйте, undo75, Вы писали:

Что-то напомнило:
Re[5]: а такая вот задачка
От: undo75  
Дата: 01.02.25 11:55
Оценка:
SD>Определись сперва, тебе нормальное или равномерное распределение? Если равномерное, задача тривиальная, а если нормальное, то решения нет.

мне сформулировали именно про нормальное распределение. тоже думал о равномерно. и как сказали — задача из жизни и решение есть.
кстати чатбот Фигню сказал?

https://rsdn.org/forum/alg/8891029.1
Автор: undo75
Дата: 31.01.25
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.