Ваша задача - написать программу или функцию, которая выводит n
случайные числа из интервала [0,1] с фиксированной суммой s
.
вход
n, n≥1
, количество случайных чисел для генерации
s, s>=0, s<=n
, сумма чисел, которые будут сгенерированы
Выход
Случайный n
набор чисел с плавающей запятой со всеми элементами из интервала [0,1] и суммой всех элементов, равных s
, выводится любым удобным однозначным способом. Все допустимые n
кортежи должны быть одинаково вероятными в пределах ограничений чисел с плавающей запятой.
Это равносильно равномерной выборке из пересечения точек внутри n
-мерного единичного куба и n-1
-мерной гиперплоскости, которая проходит (s/n, s/n, …, s/n)
и перпендикулярна вектору (1, 1, …, 1)
(см. Красную область на рисунке 1 для трех примеров).
Рисунок 1: Плоскость действительных выходов с n = 3 и суммами 0,75, 1,75 и 2,75
Примеры
n=1, s=0.8 → [0.8]
n=3, s=3.0 → [1.0, 1.0, 1.0]
n=2, s=0.0 → [0.0, 0.0]
n=4, s=2.0 → [0.2509075946818119, 0.14887693388076845, 0.9449661625992032, 0.6552493088382167]
n=10, s=9.999999999999 → [0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999,0.9999999999999]
правила
- Ваша программа должна завершиться менее чем за секунду на вашем компьютере, по крайней мере, с
n≤10
любым допустимым s - Если вы хотите, ваша программа может быть эксклюзивной на верхнем конце, то есть
s<n
и выходных чисел из полуоткрытого интервала [0,1) (ломая второй пример) - Если ваш язык не поддерживает числа с плавающей запятой, вы можете подделать вывод не менее десяти десятичных цифр после запятой.
- Стандартные лазейки запрещены, и стандартные методы ввода / вывода разрешены.
- Это код-гольф , поэтому выигрывает самая короткая запись в байтах.
This is equal to uniformly sampling from the intersection
- я вижу программу, выбирающую случайным образом только из углов этого пересечения. Это будет действительным?
s==0 or s==3
. Для всех других значений s
плоскость имеет ненулевую площадь, и вы должны случайным образом выбрать точку на этой плоскости.
s=2.99999999999, n=3
? Можем ли мы генерировать случайные реальные числа, например, кратные 1e-9
?