Immer N Zufallszahlen, deren Summe M
Ich will N Zufallszahlen, deren Summe einen Wert.
Zum Beispiel, nehmen wir an, ich möchte 5 zufällige zahlen, die Summe zu 1.
Dann, eine gültige Möglichkeit ist:
0.2 0.2 0.2 0.2 0.2
Andere Möglichkeit ist:
0.8 0.1 0.03 0.03 0.04
Und so weiter. Ich brauche diese für die Erstellung einer matrix von Sachen für Fuzzy C-means.
- Mögliche Duplikate von Zufällige zahlen, die zu 100: Matlab
- Mit einer gleichmäßigen Verteilung? Nicht-negative zahlen? Im Bereich [0,1]?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort:
Längere Antwort:
Die oben genannte Lösung funktioniert nicht ergeben eine gleichmäßige Verteilung, die könnte ein Problem sein, je nachdem, was diese Zufallszahlen verwendet werden.
Eine andere Methode vorgeschlagen, die von Matti Virkkunen:
Ich bin mir nicht sicher, ob diese Ausbeute eine gleichmäßige Verteilung
Erzeugen N-1 Zufallszahlen zwischen 0 und 1, fügen Sie die zahlen 0 und 1 die sich auf der Liste, Sortieren Sie, und nehmen Sie die Unterschiede der angrenzenden zahlen.
N
Variablen sind gezeichnet durch die identische PDF -f(x) = M^(1 - N) (-1 + N) (M - x)^(-2 + N)
. Beachten Sie, dass die mittlere istM/N
als erwartet.Ich denke, es ist erwähnenswert, dass die derzeit akzeptierte Antwort nicht mit einer uniform-Verteilung:
Um dies zu sehen betrachten wir den Fall N=2 und M=1. Dies ist ein trivialer Fall, da können wir generieren eine Liste [x,1-x], durch die Wahl von x gleichmäßig in den Bereich (0,1).
Die vorgeschlagene Lösung erzeugt ein paar [x/(x+y), y/(x+y)], wobei x und y sind einheitlich in (0,1). Um dies zu analysieren, die wir wählen z so, dass 0 < z < 0.5 und berechnen Sie die Wahrscheinlichkeit, dass
das erste element ist kleiner als z ist. Diese probaility sollte z sein, wenn die Verteilung einheitlich. Allerdings bekommen wir
Habe ich einige schnelle Berechnungen und es scheint, dass die einzige Lösung so weit, dass appers, um im Ergebnis eine gleichmäßige Verteilung war vorgeschlagen von Matti Virkkunen:
x
und dann teilen Sie durchsqrt(x)
, das Ergebnis ist nicht gleichmäßig verteilt.In Java:
randNums[i] /= sum * m;
entsprichtrandNums[i] = randNums[i] / (sum * m);
. Dies mussrandNums[i] = randNums[i] / sum * m;
so, dass die Reihenfolge der Operatoren korrekt ist.Dieses problem ist äquivalent zu dem problem der Erzeugung von Zufallszahlen mit einer Dirichlet-Verteilung. Zum generieren von N positiven zahlen, die Summe, um eine positive Zahl M, wobei jede mögliche Kombination ist gleich wahrscheinlich:
Generieren N exponentiell-verteilte Zufallszahlen. Eine Möglichkeit generieren eine solche Zahl kann geschrieben werden als—
wo
ln(x)
ist der Natürliche Logarithmus vonx
undRNDU()
ist eine Methode, die liefert eine Zufallszahl, die 0 oder größer und kleiner als 1 ist (z.B., JavaScriptMath.random()
). Beachten Sie, dass die Erzeugung dieser zahlen mit einer gleichmäßigen Verteilung ist nicht ideal, weil eine verzerrte Verteilung von random-Zahl-Kombinationen führen.Ist das Ergebnis N zahlen in einer Dirichlet-Verteilung, deren Summe ist etwa gleich M (ich sage "ungefähr", weil der Rundungsfehler).
Dieses problem ist äquivalent zu dem problem der Erzeugung von Zufallszahlen gleichmäßig aus einem N-dimensionalen simplex.
Die Erweiterung auf Guillaume akzeptiert die Antwort, hier ist eine Java-Funktion, die macht genau das.
In einem Testlauf
getRandDistArray(5, 1.0)
kehrte die folgenden:Haben Sie nun N Zufallszahlen, und Ihre Summe ist die gesuchte Summe.
Leider, eine Zahl, die Antworten hier sind falsch, wenn Sie möchten, gleichmäßig Zufallszahlen. Die einfachste (und am schnellsten in vielen Sprachen) - Lösung, die garantiert gleichmäßig Zufallszahlen ist nur
wo
n
ist die Anzahl der Zufallszahlen, die Sie generieren möchten undm
ist die Summe der das resultierende array. Dieser Ansatz erzeugt positive Werte und ist besonders hilfreich für die Generierung von gültigen Wahrscheinlichkeiten, dass eine Summe von 1 (let m = 1).Du bist ein wenig schlank auf Einschränkungen. Viele Verfahren arbeiten.
Beispielsweise sind zahlen, die normalerweise verteilt? Uniform?
I ' L davon ausgehen, dass alle zahlen müssen positiv sein und gleichmäßig verteilt um den Mittelwert, M/N.
Versuchen.