2013-04-12 88 views
7

我想在C#中編寫一個方法來生成一個高斯隨機數,分佈在[0:1](預先在[0-x]範圍內)。 我發現這個代碼,但不能正常工作使用高斯分佈在0和1之間生成隨機數

Random rand = new Random(); //reuse this if you are generating many 
double u1 = rand.NextDouble(); //these are uniform(0,1) random doubles 
double u2 = rand.NextDouble(); 
double randStdNormal = Math.Abs(Math.Sqrt(-2.0 * Math.Log(u1)) * 
           Math.Sin(2.0 * Math.PI * u2)); 
+7

可能重複? http://stackoverflow.com/q/1303368/2065121 –

+0

@ RogerRowland,不,這是不同的,我想寫一個簡單的方法而不是一個類,我發現這個方法,但這種方法有時返回我的否定結果,而不是精確的結果 – zhilevan

+4

「簡單方法」和類之間的區別僅僅是包裝。這個答案有你需要的信息,尤其是方法。不管你想要怎麼打包。 –

回答

2

我寫了一篇關於如何與任何給定的分佈產生隨機數的博客文章:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

總結,你想要的算法是:

  1. 計算出所需的概率分佈函數使得面積在曲線的一部分之下等於在該範圍內隨機生成值的概率。
  2. 積分概率分佈以確定累積分佈
  3. 反轉累積分佈得到分位數函數
  4. 通過運行分位數函數來轉換均勻分佈的(0,1)隨機數據。

當然,如果你已經知道你想要的分佈的分位數函數,那麼你不需要做一到三步。

1

你說要爲正態分佈(高斯)隨機數發生器0和1之間

所有正態分佈是無界的第一次......你在你的例子顯示功能產生正態分佈隨機數字的平均值爲0.0,標準偏差爲1.0

您可以通過將從此函數獲得的值乘以所需的標準偏差,然後添加所需的平均值,生成任意平均值和標準偏差的正態分佈隨機值。 。

該代碼可以照原樣 - 該問題是誤差的高斯(正常)分佈,其範圍爲-inf到+ inf ...

大約2/3的時間您獲得的值將在+/- 1標準偏差之間。 ...大約95%的時間值將在+/1 3倍標準差之間...

相關問題