Il tuo compito è scrivere un programma o una funzione che emetta n
numeri casuali dall'intervallo [0,1] con somma fissa s
.
Ingresso
n, n≥1
, numero di numeri casuali da generare
s, s>=0, s<=n
, somma dei numeri da generare
Produzione
Una n
coppia casuale di numeri in virgola mobile con tutti gli elementi dell'intervallo [0,1] e la somma di tutti gli elementi uguali s
, viene emessa in modo conveniente e non ambiguo. Tutte le n
coppie valide devono essere ugualmente probabili entro i limiti dei numeri in virgola mobile.
Ciò equivale a campionare in modo uniforme dall'intersezione dei punti all'interno del n
cubo dell'unità dimensionale e n-1
dell'iperpiano dimensionale che attraversa (s/n, s/n, …, s/n)
ed è perpendicolare al vettore (1, 1, …, 1)
(vedere l'area rossa in Figura 1 per tre esempi).
Figura 1: il piano delle uscite valide con n = 3 e somme 0,75, 1,75 e 2,75
Esempi
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]
Regole
- Il tuo programma dovrebbe terminare in meno di un secondo sul tuo computer almeno con
n≤10
e tutti i messaggi di posta elettronica validi. - Se lo desideri, il tuo programma può essere esclusivo sull'estremità superiore, ovvero
s<n
i numeri di output dell'intervallo semi-aperto [0,1) (interrompendo il secondo esempio) - Se la tua lingua non supporta numeri in virgola mobile, puoi falsificare l'output con almeno dieci cifre decimali dopo il punto decimale.
- Non sono consentite scappatoie standard e sono consentiti metodi di input / output standard.
- Si tratta di code-golf , quindi vince la voce più breve, misurata in byte.
This is equal to uniformly sampling from the intersection
: vedo un programma scegliere casualmente solo dagli angoli di quell'intersezione. Sarebbe valido?
s==0 or s==3
. Per tutti gli altri valori di s
, il piano ha un'area diversa da zero e devi scegliere in modo casuale un punto su quel piano.
s=2.99999999999, n=3
? Possiamo generare reali casuali in multipli di, diciamo 1e-9
,?