Простий та елегантний спосіб оцінити Монте-Карло описаний у цій роботі . Ця стаття насправді стосується навчання . Отже, підхід здається ідеально відповідним вашій меті. Ідея заснована на вправі з популярного російського підручника з теорії ймовірностей Гнеденка. Див. Вих.22 на стор.183еee
Буває так, що , де - випадкова величина, яка визначається наступним чином. Це мінімальна кількість таких, що і - випадкові числа з рівномірного розподілу на . Красиво, чи не так ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξn∑ni=1ri>1ri[0,1]
Оскільки це вправа, я не впевнений, чи здорово мені розміщувати рішення (доказ) тут :) Якщо ви хочете довести це самостійно, ось рада: глава називається "Моменти", який повинен вказувати ви в правильному напрямку.
Якщо ви хочете реалізувати це самостійно, тоді не читайте далі!
Це простий алгоритм моделювання Монте-Карло. Намалюйте рівномірний випадковий, потім ще один і так далі, поки сума не перевищить 1. Кількість проведених виплат є вашим першим випробуванням. Скажімо, ви отримали:
0.0180
0.4596
0.7920
Тоді ваш перший випробування винесено 3. Продовжуйте робити ці випробування, і ви помітите, що в середньому ви отримуєте .e
Код MATLAB, результат моделювання та гістограма слідують.
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)
Результат та гістограма:
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
ОНОВЛЕННЯ: Я оновив свій код, щоб позбутися масиву результатів пробних програм, щоб він не зайняв оперативну пам'ять. Я також надрукував оцінку PMF.
Оновлення 2: Ось моє рішення Excel. Покладіть кнопку в Excel і зв’яжіть її з таким макросом VBA:
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
Введіть кількість випробувань, таких як 1000, у комірку D1 та натисніть кнопку. Ось як повинен виглядати екран після першого запуску:
ОНОВЛЕННЯ 3: Срібляста рибка надихнула мене на інший спосіб, не такий елегантний, як перший, але все ще крутий. Він підрахував обсяги n-симплексів, використовуючи послідовності Соболя .
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
Випадково він написав першу книгу про метод Монте-Карло, яку я прочитав ще в середній школі. На мій погляд, це найкраще вступ до методу.
ОНОВЛЕННЯ 4:
Срібна рибка у коментарях запропонувала просту реалізацію формули Excel. Це такий результат, який ви отримуєте з його підходу після приблизно 1 мільйона випадкових чисел і 185K випробувань:
Очевидно, це набагато повільніше, ніж реалізація VBA Excel. Тим більше, якщо ви модифікуєте мій код VBA, щоб він не оновлював значення комірок всередині циклу, а роби це лише після того, як всі статистичні дані будуть зібрані.
ОНОВЛЕННЯ 5
Рішення Xi'an №3 тісно пов'язане (або навіть таке саме в певному сенсі, як і в коментарі jwg в потоці). Важко сказати, хто придумав першу ідею Форсайта чи Гнеденка. Оригінальне видання 1950 р. Гнеденка російською мовою не має розділів Проблеми в розділах. Отже, я не міг знайти цю проблему з першого погляду, де вона є в пізніших виданнях. Можливо, він був доданий пізніше або закопаний у тексті.
Як я прокоментував відповідь Сіань, підхід Форсайта пов'язаний з іншою цікавою областю: розподілом відстаней між піками (екстремумами) у випадкових (IID) послідовностях. Середня відстань буває 3. Послідовність пониження в підході Форсайта закінчується дном, тому, якщо ви продовжите вибірку, ви отримаєте ще одне дно в якийсь момент, потім інше і т. Д. Ви можете відстежити відстань між ними і побудувати розподіл.
R
команда2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Якщо використання журнальної функції Gamma турбує вас, замініть її на2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, яка використовує лише додавання, множення, ділення та усікання, і ігноруйте попередження про переповнення.) Що може зацікавити більш ефективне моделювання: чи можете ви мінімізувати кількість обчислювальні кроки, необхідні для оцінки до будь-якої заданої точності?