Su tarea es escribir un programa o una función que genere n
números aleatorios del intervalo [0,1] con una suma fija s
.
Entrada
n, n≥1
, número de números aleatorios para generar
s, s>=0, s<=n
, suma de números a generar
Salida
Una n
tupla aleatoria de números de coma flotante con todos los elementos del intervalo [0,1] y la suma de todos los elementos iguales a s
, salida de cualquier manera conveniente y sin ambigüedades. Todas las n
tuplas válidas tienen que ser igualmente probables dentro de las limitaciones de los números de coma flotante.
Esto es igual al muestreo uniforme desde la intersección de los puntos dentro del n
cubo de la unidad dimensional y el n-1
hiperplano dimensional que atraviesa (s/n, s/n, …, s/n)
y es perpendicular al vector (1, 1, …, 1)
(ver el área roja en la Figura 1 para ver tres ejemplos).
Figura 1: El plano de salidas válidas con n = 3 y sumas 0.75, 1.75 y 2.75
Ejemplos
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]
Reglas
- Su programa debería terminar en menos de un segundo en su máquina al menos con
n≤10
y cualquier s válido. - Si lo desea, su programa puede ser exclusivo en el extremo superior, es decir,
s<n
y los números de salida del intervalo medio abierto [0,1] (rompiendo el segundo ejemplo) - Si su idioma no admite números de coma flotante, puede falsificar la salida con al menos diez dígitos decimales después del punto decimal.
- Las lagunas estándar no están permitidas y se permiten métodos de entrada / salida estándar.
- Este es el código de golf , por lo que gana la entrada más corta, medida en bytes.
This is equal to uniformly sampling from the intersection
: puedo ver un programa que elige al azar solo desde las esquinas de esa intersección. ¿Sería eso válido?
s==0 or s==3
. Para todos los demás valores de s
, el plano tiene un área distinta de cero y tiene que elegir de manera uniforme y aleatoria un punto en ese plano.
s=2.99999999999, n=3
? ¿Podemos generar reales aleatorios en múltiplos de, digamos 1e-9
,?