蒙地卡羅

正常隨機數生成中的極端情況如何處理?

  • July 28, 2014

為了生成正態隨機數,通常會生成服從均勻分佈的隨機數 $ Z \sim \mathcal{U}(0,1) $ 然後對它們應用反向 CDF 函式 $ X=\Phi^{-1}(Z) \sim \mathcal{N}(0,1) $ .

但是,我遇到了一個有問題的情況,其中一個生成的 $ Z $ 結果正好給出 0。然後,你有 $ X=\Phi^{-1}(Z)=- \infty $ .

當您生成隨機樣本時,這是非常有問題的,因為它通常會破壞您基本上返回的所有變異數/共變異數測量,nan或者inf當樣本包含無限數量時。

你通常如何處理這個問題?您是否在每個生成的隨機數之後檢查值是 0 還是 1 並稍微移動它(或簡單地丟棄它)?

實際上,出於計算目的,您能做的最好的事情是在另一個區間上使用均勻分佈 $ [10^{-10},1-10^{-10}] $ ,或者只是丟棄所有出現的 $ Z=0,1 $ .

丟棄 $ Z=0,1 $ 是合理的,因為對於連續分佈 $ P(Z=0)=P(Z=1)=0 $ .

我同意@encor 的觀點,即包含一些避免錯誤的邏輯不是問題。我想大多數非均勻隨機數生成器已經包含了它。

我不認為我使用了一個給出 0 的偽隨機數生成器。我不是該主題的專家,但一個常見的實現(線性同餘生成器)依賴於模運算。例如,生成器 $ X_{n+1}=f(X_{n})mod: m $ 可能會產生介於 0 和 $ m-1 $ 在哪裡 $ m $ 是一個很大的數字。然後你可以除以 $ m $ 並確保所有數字都在 0 和 1 之間。獲得零的唯一方法是 $ f(X_{n}) $ 等於 $ m $ . 如果 $ m $ 足夠大(而且大多數人似乎都在使用 $ 2^{31} $ 或者 $ 2^{32} $ ),那麼這應該是非常罕見的。

我能想到的唯一另一件事是類型問題。例如,您可能需要一個 unsigned int 或 long 來生成隨機整數。得到 0 和 1 之間的除法建議使用 float 或 double 類型。它可能會將事物向下舍入為 0 而不是 0.xxx1。

如果您對上述內容不滿意,還有其他採樣分佈的技術。例如,您可以將分佈表示為 Meucci 的完全靈活的極端視圖中的網格(儘管沒有熵池部分)。然後,您可以使用他描述的線性插值來模擬網格分佈。

引用自:https://quant.stackexchange.com/questions/14126