Wählen Sie n Zahlen mit fester Summe

In einem Code möchte ich n Zufallszahlen in [0,1) wählen, die zu 1 [0,1) .

Ich tue dies, indem ich die Zahlen in [0,1) unabhängig auswähle und sie normalisiere, indem ich jeden durch die Gesamtsumme dividiere:

 numbers = [random() for i in range(n)] numbers = [n/sum(numbers) for n in numbers] 

Mein “Problem” ist, dass die Verteilung, die ich bekomme, ziemlich schräg ist. Wählen Sie eine Million Zahlen nicht eine einzige wird über 1/2 . Mit etwas Mühe habe ich das pdf berechnet, und es ist nicht nett.

Hier ist das komisch aussehende PDF, das ich für 5 Variablen bekomme:

Bildbeschreibung hier eingeben

Haben Sie eine Idee für einen schönen Algorithmus, um die Zahlen zu wählen, die zu einer einheitlicheren oder einfacheren Verteilung führen?

   

Sie möchten den Abstand von 0 bis 1 partitionieren.

Wählen Sie n – 1 Zahlen von 0 bis 1, sortieren Sie sie und bestimmen Sie die Abstände zwischen ihnen.

Dadurch wird der Speicherplatz 0 auf 1 aufgeteilt, was zu gelegentlichen großen Ergebnissen führen sollte, die Sie nicht erhalten.

Bei großen Werten von n können Sie jedoch im Allgemeinen erwarten, dass auch Ihr Maximalwert sinkt, nicht so schnell wie bei Ihrer Methode.

Sie könnten an der Dirichlet-Verteilung interessiert sein, die für die Generierung von Mengen verwendet wird, die sich zu 1 addieren, wenn Sie nach Wahrscheinlichkeiten suchen. Es gibt auch einen Abschnitt darüber, wie man sie mithilfe von Gamma-Distributionen erzeugt.

Eine andere Möglichkeit, n Zufallszahlen zu erhalten, die zusammen 1 ergeben:

 import random def create_norm_arr(n, remaining=1.0): random_numbers = [] for _ in range(n - 1): r = random.random() # get a random number in [0, 1) r = r * remaining remaining -= r random_numbers.append(r) random_numbers.append(remaining) return random_numbers random_numbers = create_norm_arr(5) print(random_numbers) print(sum(random_numbers)) 

Dies macht höhere Zahlen wahrscheinlicher.