Die Generierung der Werte von der Normalverteilung mit Hilfe von Box-Muller-Methode
Schreibe ich eine kleine Funktion zum generieren der Werte von der Normalverteilung mit Hilfe von Box-Muller-Methode, aber ich bin immer negative Werte.
Hier ist mein source code
import random
def generate_normal(mu, sigma):
u = random.random()
v = random.random()
z1 = sqrt(-2 * log(u)) * sin(2 * pi * v)
z2 = sqrt(-2 * log(u)) * cos(2 * pi * v)
x1 = mu + z1 * sigma
x2 = mu + z2 * sigma
return x2
Was bin ich? Ich bin immer negative Werte in beiden x1
und x2
. Zum Beispiel:
mu: 400
sigma: 150
u: 7.27333176449e-05
v: 0.642384573173
z1: -3.40497345242
x1: -110.746017863
und:
x2: -9.79324023117
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Einheit Normalverteilung zentriert ist, auf null, und beidseitig mit kleinen Schwänze aus, um plus und minus unendlich. 99.7% der Werte liegen innerhalb von drei Standardabweichungen, die andere 0.3% nicht.
In diesem Beispiel, mit einem Mittelwert von 400 und einer Standardabweichung von 150, 99.7% der Werte liegen innerhalb von drei Standardabweichungen vom Mittelwert - Intervall von [-50,850], die beinhaltet, dass negative zahlen. So erwarten negative zahlen rechts von der Fledermaus.
Als für die anderen 0,3% der Werte, denken Sie daran, dass die 3/1000 Ihrer zahlen - nicht selten auf allen.
Wenn Sie möchten, eine "Glocke " curvey" Verteilung mit endlicher Unterstützung, versuchen die beta-Verteilung.
Schließlich, es sei denn, dies ist eine Akademische übung, es gibt keine Notwendigkeit, Rollen Sie Ihre eigenen äquivalent zu
numpy.random.normal()
.:)
. Vielen, vielen Dank!numpy.random.normal()
?random.gauss
(schneller, aber nicht threadsicher) oderrandom.normalvariate
. Das heißt, wenn ich mich Recht erinnere die vorliegende Methode ist anfällig für numerische Instabilitäten (es ist besser zu wählen, zufällige Koordinaten in eine Einheit-Platz und lehnen Sie ab, wenn Sie außerhalb der Einheit Platz, eher als die Wahl einer weighted-random radius und zufälligen Winkel), und ist wegwerfen die Hälfte der gültigen Ergebnisse (x1
ist so zufällig wiex2
, und unabhängig, besser zu erinnern, diesen Wert und gibt ihn zurück jeder anderen Zeit, oder verwenden Sie einen generator undyield
beide Werte in einer Schleife).yield
so dass ich kann zurückx1
,x2
, dann erzeugen Sie zwei neue, und wiederholen Sie den Vorgang. @Li-aungYip ich bin die Entwicklung einer simulation eines Flughafens für Akademische Zwecke und die Idee ist die Implementierung der verwendeten Verteilungen von Grund auf neu (Normal -, Poisson-und Exponentielle). Ich danke Ihnen sehr!Box-Muller transformation hat Stabilitätsprobleme, wenn der zufällig generierte Wert sehr nahe null. Ich empfehle zu ersetzen, ist zufällig.random() durch gaussinan Verteilung und beeinflussen durch Ihren Mittelwert und die Standardabweichung.