Votre tâche consiste à écrire un programme ou une fonction qui génère n
des nombres aléatoires de l'intervalle [0,1] avec une somme fixe s
.
Contribution
n, n≥1
, nombre de nombres aléatoires à générer
s, s>=0, s<=n
, somme des nombres à générer
Sortie
Un n
-tuple aléatoire de nombres à virgule flottante avec tous les éléments de l'intervalle [0,1] et la somme de tous les éléments égaux à s
, émis de toute manière pratique et sans ambiguïté. Tous les n
-tuples valides doivent être également probables dans les limites des nombres à virgule flottante.
Cela équivaut à un échantillonnage uniforme à partir de l'intersection des points à l'intérieur du n
cube d'unités dimensionnelles et de l' n-1
hyperplan dimensionnel qui traverse (s/n, s/n, …, s/n)
et est perpendiculaire au vecteur (1, 1, …, 1)
(voir la zone rouge sur la figure 1 pour trois exemples).
Figure 1: Le plan des sorties valides avec n = 3 et des sommes de 0,75, 1,75 et 2,75
Exemples
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]
Règles
- Votre programme doit se terminer en moins d'une seconde sur votre machine au moins avec
n≤10
et tout s valide. - Si vous le souhaitez, votre programme peut être exclusif sur l'extrémité supérieure, c'est-à
s<n
- dire et les numéros de sortie de l'intervalle semi-ouvert [0,1) (en cassant le deuxième exemple) - Si votre langue ne prend pas en charge les nombres à virgule flottante, vous pouvez simuler la sortie avec au moins dix chiffres décimaux après le point décimal.
- Les failles standard sont interdites et les méthodes d'entrée / sortie standard sont autorisées.
- Il s'agit de code-golf , donc l'entrée la plus courte, mesurée en octets, gagne.
This is equal to uniformly sampling from the intersection
- je peux voir un programme choisir aléatoirement à partir des coins de cette intersection. Serait-ce valable?
s==0 or s==3
. Pour toutes les autres valeurs de s
, le plan a une zone non nulle et vous devez choisir de manière uniforme et aléatoire un point sur ce plan.
s=2.99999999999, n=3
? Pouvons-nous générer des réels aléatoires en multiples de, disons 1e-9
?