Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben , die Zufallszahlen aus Intervall [0,1] mit fester Summe ausgibt .n
s
Eingang
n, n≥1
, Anzahl der zu generierenden Zufallszahlen
s, s>=0, s<=n
, Summe der zu generierenden Zahlen
Ausgabe
Ein zufälliges n
Tupel von Gleitkommazahlen mit allen Elementen aus dem Intervall [0,1] und der Summe aller Elemente, die gleich sind s
, wird auf eine bequeme, eindeutige Weise ausgegeben. Alle gültigen n
Tupel müssen innerhalb der Grenzen von Gleitkommazahlen gleich wahrscheinlich sein.
Dies ist gleichbedeutend mit einer gleichmäßigen Abtastung vom Schnittpunkt der Punkte innerhalb des n
Würfels mit den Maßeinheiten und der n-1
eindimensionalen Hyperebene, die durch (s/n, s/n, …, s/n)
den Vektor verläuft und senkrecht zum Vektor verläuft (1, 1, …, 1)
(siehe roter Bereich in Abbildung 1 für drei Beispiele).
Abbildung 1: Die Ebene der gültigen Ausgaben mit n = 3 und den Summen 0,75, 1,75 und 2,75
Beispiele
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]
Regeln
- Ihr Programm sollte auf Ihrem Computer in weniger als einer Sekunde beendet sein, zumindest mit
n≤10
und allen gültigen s. - Wenn Sie möchten, kann Ihr Programm am oberen Ende exklusiv sein, dh
s<n
und die Ausgabenummern aus dem halboffenen Intervall [0,1) (unterbrechen des zweiten Beispiels) - Wenn Ihre Sprache keine Gleitkommazahlen unterstützt, können Sie die Ausgabe mit mindestens zehn Dezimalstellen nach dem Komma fälschen.
- Standard-Regelungslücken sind nicht zulässig, und Standard-Eingabe- / Ausgabemethoden sind zulässig.
- Das ist Code-Golf , also gewinnt der kürzeste Eintrag, gemessen in Bytes.
This is equal to uniformly sampling from the intersection
- ich kann ein Programm sehen, das zufällig nur aus den Ecken dieser Kreuzung auswählt. Wäre das gültig?
s==0 or s==3
. Für alle anderen Werte von s
hat die Ebene eine Fläche ungleich Null und Sie müssen einen Punkt auf dieser Ebene gleichmäßig zufällig auswählen.
s=2.99999999999, n=3
? Können wir zufällige Reals in Vielfachen von beispielsweise generieren 1e-9
?