2014-07-07 42 views
0

我需要在C++ 11中實現我自己的隨機數分佈類,但我找不到一個簡約的實現,讓我開始。自己實現的隨機數分佈的C + + 11

我已經搜索了gcc源代碼,但只找到了頭文件,而不是不同的非均勻分佈的實現。

你能指點我一個簡單而完整的C++ 11中的非均勻分佈類的例子嗎?

+2

隨機數字庫僅爲標題,而libstdC++提供的標題包含您想要了解的所有內容。 –

+0

在頭文件中,我總是看到兩個重載()操作符在不同的分佈類中。第一個叫第二個,但第二個似乎沒有實現。 – MosteM

+0

醫生開了更多的咖啡,[更堅韌](http://meta.stackoverflow.com/a/261593/596781)和一個健康的'grep':這些都在'bits/random.tcc'中。 –

回答

4

我想實現自己的分佈是沒有什麼太奇特...

你猜錯了。 Luc Devroye撰寫了關於該主題的800 page book。沒有適用於所有發行版的單一技術。有4種的一般方法:

  1. 倒置 - 如果累積分佈函數F X(b)中, - ∞ < b < ∞,是一個連續的和可逆函數,則F X(X) ,CDF應用於其自身的隨機變量,具有統一的(0,1)分佈。等於F X(X)= U並求解X(如果可能的話)。

  2. 卷積 - 求和或差分隨機變量產生一個新的分佈。例如,兩件制服的總和有三角形分佈;或者,n個獨立卡方(1)的和產生卡方(n)組合 - 使用條件概率,可以從較簡單的分佈中分段地構建一些複雜的分佈。訣竅/特殊關係 - 利用不同分佈之間的獨特關係,例如標準法線的平方是卡方(1)隨機變量的事實;或者卡方(2)與指數(2)相同。與畢達哥拉斯的論點一起,這兩個事實是Box-Muller生成法線方法的核心。繪製兩個獨立的標準法線,您可以從(0,0)中獲得一個以統一方向(0,2 π)爲方向的長度爲sqrt(exponential(2))的2-d向量。生成這樣的矢量,並使用正弦和餘弦變換將其轉換回笛卡爾座標,以生成兩個獨立的法線。

Devroye的書在許多「冷門」分佈的細節罷了,但因爲有分佈的無限數量的在那裏一個詳盡的治療將是不可能的。

tutorial paper第59頁第4.3節對上述四種技術中的每一種都有一個工作示例,並且在第60-62頁上有一個反轉證明。

+1

+1和更多信息:該標準提供了'piecewise_constant_distribution'和'piecewise_linear_distribution',可以很容易地用來近似任意分佈。如果這樣的近似值是可以接受的,並且如果你知道你想要的概率分佈,那麼這些是易於使用的可行替代方案。 –

+0

P.S:不錯的教程紙! –

+0

@HowardHinnant謝謝,我發現很難在嚴格正確和可訪問之間走鋼絲。 – pjs