Sua tarefa é escrever um programa ou uma função que produza n
números aleatórios do intervalo [0,1] com soma fixa s
.
Entrada
n, n≥1
, número de números aleatórios a serem gerados
s, s>=0, s<=n
, soma dos números a serem gerados
Saída
Um número aleatório n
de números de ponto flutuante com todos os elementos do intervalo [0,1] e a soma de todos os elementos iguais a s
, são emitidos de qualquer maneira conveniente e inequívoca. Todos os n
-tuplos válidos devem ter a mesma probabilidade dentro das limitações dos números de ponto flutuante.
Isso é igual à amostragem uniforme da interseção dos pontos dentro do n
cubo da unidade tridimensional e do n-1
hiperplano tridimensional que passa (s/n, s/n, …, s/n)
e é perpendicular ao vetor (1, 1, …, 1)
(veja a área vermelha na Figura 1 para três exemplos).
Figura 1: O plano de saídas válidas com n = 3 e soma 0,75, 1,75 e 2,75
Exemplos
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]
Regras
- Seu programa deve terminar em menos de um segundo em sua máquina pelo menos com
n≤10
e quaisquer s válidos. - Se desejar, seu programa pode ser exclusivo na extremidade superior, ou seja,
s<n
os números de saída do intervalo semiaberto [0,1) (quebrando o segundo exemplo) - Se o seu idioma não suportar números de ponto flutuante, você poderá falsificar a saída com pelo menos dez dígitos decimais após o ponto decimal.
- As brechas padrão não são permitidas e os métodos padrão de entrada / saída são permitidos.
- Isso é código-golfe , então a entrada mais curta, medida em bytes, vence.
This is equal to uniformly sampling from the intersection
- eu posso ver um programa escolhendo aleatoriamente apenas nos cantos do cruzamento. Isso seria válido?
s==0 or s==3
. Para todos os outros valores de s
, o plano tem área diferente de zero e você precisa escolher aleatoriamente um ponto nesse plano.
s=2.99999999999, n=3
? Podemos gerar reais aleatórios em múltiplos de, digamos 1e-9
,?