2011-07-16 31 views
3

我正在尋找一種方法來生成一組具有指定的平均值和性病的整數。偏差。生成一組大小爲N的整數的最佳方法,如正態分佈,給定均值和標準差。偏差

使用隨機庫,它可以生成一組分佈在高斯的方式隨機雙打,這將是這個樣子:

#include <tr1/random> 

std::tr1::normal_distribution<double> normal(mean, stdDev); 
std::tr1::ranlux64_base_01 eng; 
eng.seed(1000); 
for (int i = 0; i < N; i++) 
{ 
    gaussiannums[i] = normal(eng); 
} 

但是,對於我的申請,我需要整數,而不是雙打。所以我的問題是,你如何產生上述的等價物,而不是雙數的整數?採取一種可能的路徑是在雙打轉換成整數,以某種方式,但我不知道有足夠的瞭解隨機庫是如何工作的知道這是否能以一種方式,真正保留了鐘形,平均/ STD完成。偏差。

我應該提到的是,這裏的目的與其說是隨機性的,因爲它是獲得一組特定大小的整數,用正確的均值和性病。偏差。

理想我也想指定的最小和可產生最大的價值,但我還沒有找到任何辦法,甚至對雙打做到這一點,所以在這個任何建議也歡迎。

+2

當您說「高斯」時,您確實指定了最小值和最大值。你或者需要指定你的目標是什麼(你需要什麼樣的隨機性),而不是你的方法(生成「高斯」整數),或者返回並研究統計數據,以便理解爲什麼你的問題沒有意義。 (其中,要生成整數,你需要一個離散分佈,但高斯是連續的)。 –

+0

我有點看到你的觀點,但我仍然認爲這很有道理。我想要做的是生成一系列分佈在一定範圍內的整數,滿足給定的均值和標準。開發。這是最重要的部分,但我也希望這些整數形成一個鐘形曲線,儘管它不能是嚴格的高斯曲線,但我希望它儘可能地保留這個屬性。也許四捨五入實際上就是這樣嗎? – ChrKroer

+0

然後我建議你在你感興趣的整數範圍內計算一個高斯CDF,稍微拉伸以解釋缺失的尾部,並將它存儲在一個數組中。然後在[0:1]範圍內生成一致實數,並使用二分搜索來反轉CDF。這個從任意CDF生成樣本的過程非常標準。 –

回答

6

這是不可能的。

高斯分佈是連續的,整數集合是離散的。

高斯PDF有無限的支持,如果您指定的最小和最大你也有不同的分佈。

你真的想做什麼?這只是平均值和標準偏差嗎?其他分佈具有明確的均值和標準差,包括幾個離散分佈。


例如,您可以使用a binomial distribution

同時求解均值和方差的方程式得到pn。然後從這個分佈生成樣本。

如果n不出來整數,您可以改爲使用多項分佈。


儘管維基百科描述了從二項式或多項式分佈中抽樣的方法,但它們並不是特別有效。有一種方法可以從任意的分佈式分佈中高效地生成樣本,您可以在這裏使用它。

在評論,你澄清,你想與特定的平均值和標準偏差和有限支持的鐘形分佈。因此,我們將利用高斯爲出發點:

  • 計算高斯CDF跨越
  • 抵消你感興趣的整數範圍略有擴大它考慮到丟失的尾巴(因此而改變從0到1)
  • 它存儲在一個陣列

要從這種分佈進行採樣:

  • 產生均勻的意圖在範圍LS [0:1]
  • 使用二進制搜索反轉CDF

作爲截斷步驟會稍微降低的標準偏差(並影響平均另外,如果最小和最大不與選定的平均值等距),您可能必須事先略微調整高斯參數。

+0

我想這樣做的一些天真的方法是從[-1,+ 1]生成統一數字,並將它們中的N加起來得到範圍[-N,+ N]中的數字。儘管如此,這將產生與高斯不同的分佈。 –

+0

@Mike:如果這些是連續的隨機變量,它們的和將具有與高斯非常相似的分佈(由中心極限定理)。如果你的意思是從離散集合{-1,1}繪製,那麼是的,它將是非高斯的(儘管CDF仍然非常接近高斯)。 –

+0

是的,我的意思是{-1,+1},而不是實數。他可以設置平均值和標準偏差,也可以通過對輸出進行重新調整,但強制任意的最小值和最大值會很棘手。 –

相關問題