Die einfache und elegante Art, nach Monte Carlo zu schätzen, wird in diesem Artikel beschrieben . In der Arbeit geht es eigentlich um das Unterrichten von . Daher scheint der Ansatz perfekt zu Ihrem Ziel zu passen. Die Idee basiert auf einer Übung aus einem beliebten russischen Lehrbuch zur Wahrscheinlichkeitstheorie von Gnedenko. Siehe Beispiel 22 auf S.183eee
Es passiert also, dass , wobei eine Zufallsvariable ist, die wie folgt definiert ist. Es ist die minimale Anzahl von so dass und Zufallszahlen aus der Gleichverteilung von . Schön, nicht wahr ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξn∑ni = 1rich> 1rich[ 0 , 1 ]
Da es sich um eine Übung handelt, bin ich mir nicht sicher, ob es für mich cool ist, die Lösung (Beweis) hier zu posten :) Wenn Sie es selbst beweisen möchten, hier ein Tipp: Das Kapitel heißt "Momente", was darauf hindeuten sollte Sie in die richtige Richtung.
Wenn Sie es selbst implementieren möchten, lesen Sie nicht weiter!
Dies ist ein einfacher Algorithmus für die Monte-Carlo-Simulation. Ziehe einen einheitlichen Zufallsgenerator, dann einen weiteren und so weiter, bis die Summe 1 übersteigt. Die Anzahl der gezogenen Zufälle ist dein erster Versuch. Angenommen, Sie haben:
0.0180
0.4596
0.7920
Dann wurde Ihre erste Testversion gerendert. 3. Führen Sie diese Testversionen weiter aus, und Sie werden feststellen, dass Sie im Durchschnitt .e
MATLAB-Code, Simulationsergebnis und das Histogramm folgen.
N = 10000000;
n = N;
s = 0;
i = 0;
maxl = 0;
f = 0;
while n > 0
s = s + rand;
i = i + 1;
if s > 1
if i > maxl
f(i) = 1;
maxl = i;
else
f(i) = f(i) + 1;
end
i = 0;
s = 0;
n = n - 1;
end
end
disp ((1:maxl)*f'/sum(f))
bar(f/sum(f))
grid on
f/sum(f)
Das Ergebnis und das Histogramm:
2.7183
ans =
Columns 1 through 8
0 0.5000 0.3332 0.1250 0.0334 0.0070 0.0012 0.0002
Columns 9 through 11
0.0000 0.0000 0.0000
UPDATE: Ich habe meinen Code aktualisiert, um die Reihe der Testergebnisse zu entfernen, sodass kein RAM benötigt wird. Ich habe auch die PMF-Schätzung ausgedruckt.
Update 2: Hier ist meine Excel-Lösung. Fügen Sie eine Schaltfläche in Excel ein und verknüpfen Sie sie mit dem folgenden VBA-Makro:
Private Sub CommandButton1_Click()
n = Cells(1, 4).Value
Range("A:B").Value = ""
n = n
s = 0
i = 0
maxl = 0
Cells(1, 2).Value = "Frequency"
Cells(1, 1).Value = "n"
Cells(1, 3).Value = "# of trials"
Cells(2, 3).Value = "simulated e"
While n > 0
s = s + Rnd()
i = i + 1
If s > 1 Then
If i > maxl Then
Cells(i, 1).Value = i
Cells(i, 2).Value = 1
maxl = i
Else
Cells(i, 1).Value = i
Cells(i, 2).Value = Cells(i, 2).Value + 1
End If
i = 0
s = 0
n = n - 1
End If
Wend
s = 0
For i = 2 To maxl
s = s + Cells(i, 1) * Cells(i, 2)
Next
Cells(2, 4).Value = s / Cells(1, 4).Value
Rem bar (f / Sum(f))
Rem grid on
Rem f/sum(f)
End Sub
Geben Sie die Anzahl der Versuche (z. B. 1000) in die Zelle D1 ein und klicken Sie auf die Schaltfläche. So sollte der Bildschirm nach dem ersten Lauf aussehen:
UPDATE 3: Silverfish hat mich auf eine andere Art inspiriert, nicht so elegant wie die erste, aber trotzdem cool. Es berechnete das Volumen von n-Simplexen unter Verwendung von Sobol- Sequenzen.
s = 2;
for i=2:10
p=sobolset(i);
N = 10000;
X=net(p,N)';
s = s + (sum(sum(X)<1)/N);
end
disp(s)
2.712800000000001
Zufällig schrieb er das erste Buch über die Monte-Carlo-Methode, das ich in der High School gelesen hatte. Meiner Meinung nach ist dies die beste Einführung in die Methode.
UPDATE 4:
Silverfish schlug in Kommentaren eine einfache Implementierung von Excel-Formeln vor. Dies ist die Art von Ergebnis, die Sie mit seiner Herangehensweise nach insgesamt 1 Million Zufallszahlen und 185K-Versuchen erhalten:
Dies ist offensichtlich viel langsamer als die Implementierung von Excel VBA. Insbesondere, wenn Sie meinen VBA-Code so ändern, dass die Zellenwerte in der Schleife nicht aktualisiert werden und erst dann aktualisiert werden, wenn alle Statistiken erfasst wurden.
UPDATE 5
Xi'ans Lösung Nr. 3 ist eng miteinander verwandt (oder in gewisser Weise sogar mit jwgs Kommentar im Thread identisch). Es ist schwer zu sagen, wer zuerst Forsythe oder Gnedenko auf die Idee kam. Gnedenkos Originalausgabe von 1950 in russischer Sprache enthält keine Abschnitte mit Problemen in Kapiteln. So konnte ich dieses Problem auf den ersten Blick nicht finden, wo es in späteren Ausgaben ist. Vielleicht wurde es später hinzugefügt oder im Text vergraben.
Wie ich in Xi'ans Antwort bemerkte, ist Forsythes Ansatz mit einem anderen interessanten Bereich verbunden: der Verteilung der Abstände zwischen Spitzen (Extrema) in zufälligen (IID) Sequenzen. Der mittlere Abstand ist zufällig 3. Die Abwärtssequenz in Forsythes Ansatz endet mit einem Boden. Wenn Sie also mit dem Abtasten fortfahren, erhalten Sie irgendwann einen anderen Boden, dann einen anderen usw. Sie könnten den Abstand zwischen ihnen verfolgen und die Verteilung aufbauen.
R
Befehl2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
tut. (Wenn Sie die Gamma-Protokollfunktion stören, ersetzen Sie diese durch2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
Addition, Multiplikation, Division und Trunkierung und ignorieren Sie die Überlaufwarnungen.) Was von größerem Interesse sein könnte, wären effiziente Simulationen: Können Sie die Anzahl minimieren ? Rechenschritte erforderlich, um mit einer bestimmten Genauigkeit abzuschätzen ?