2011-03-18 175 views
0

我不確定是否有任何語言(最好是C#.NET)支持非均勻隨機數生成器。有沒有?我想知道什麼是最好的設計方法來實現我們自己的非均勻隨機數生成器?非均勻隨機數生成器

謝謝。

+0

我發現了一些實現和設計概念http://stackoverflow.com/search?q=non-uniform+random+numbers+generator這是最好的:http://stackoverflow.com/questions/1534285 /非均勻隨機數生成器實現。他們都沒有說任何語言是否已經支持非統一的隨機數發生器。 – applefreak 2011-03-18 13:45:13

+0

C#根本不支持隨機數生成,它是提供它的BCL。要回答你的問題,我們需要知道你希望它是不是統一的方式;鐘形曲線還是別的什麼? – 2011-03-18 14:01:10

+0

謝謝工作。什麼是BCL?我使用了C#隨機數生成器,但它始終是統一的。如果我在1-100之間生成了數百萬的數字,那麼每個數字的單個計數幾乎相同。我希望選擇是完全不一致的,所以可能有些數字根本沒有被採集,有些數字計數器可能遠遠超過其他數字。我的意思是在選擇下一個號碼時不應該有任何優先權或依賴性。 – applefreak 2011-03-18 15:09:34

回答

1

我能夠根據我的要求使用均勻分佈創建半非均勻分佈。基本上,我從1到N範圍內生成所需的M個數字,然後再生成(N-M)個數字並將其丟棄。就像這樣,當我生成下一組數字時,對於1到N之間的所有數字,我的概率幾乎相等。它對我有用!

示例代碼在C#:

 int low=1, high=50; 
     Random random = new Random(); 
     int total = 50; 
     ArrayList set_nos = new ArrayList(); 

     while (--total > 0) 
     { 
      int set = 6; 
      int loop = 0; 
      while (--set > 0) 
      { 
       int temp = random.Next(low, high); 
       loop++; 
       if (set_nos.Contains(temp)) 
        continue; 

       set_nos.Add(temp); 
      } 

      for (int unused = 1; unused < high-loop; unused++) 
       random.Next(low, high); 

      //Use set_nos for your purpose! 

     } 
+0

你能舉個例子嗎? – Eddie 2011-09-20 15:12:07

+0

編輯答案! – applefreak 2011-09-23 09:34:02

1

嗯,這是2016年,這個問題沒有點,已經有一個公認的答案。但是,既然它出現在第二次,我搜索了「c#隨機非統一」,我會繼續並給我的方法。

開始之前,你必須考慮你想要什麼樣的非均勻分佈。就我而言,我需要大部分數字都很低,而有些數字應該很高。對於任何分佈,我們只需要考慮0到1之間的數字(因此在該範圍之外的屬性是不相關的)。結果可以相乘或以其他方式處理以適應任何期望的範圍。最後,(x-1)^ 4爲我工作。當x = 0時,它的值爲1,當x = 1時值爲0,但平均更可能低於高。

(x-1)^4

在C#,Random類的發生器僅產生整數。所以第一步是將其轉換使其而是產生有理數0

和1之間

var rnd = new Random(); 
var x = (double)rnd.Next(0,10000)/10000; 
然後,只需將隨機數到您所需的分佈。

x = Math.Pow(x-1,4); 

我創建了這個方法隨機生成的數字列表,並得到了以下的結果(排序並四捨五入):

0 
0.0001 
0.0109 
0.0115 
0.042 
0.1615 
0.3077 
0.5713 
0.7217 
0.8087 

正如你所看到的,分佈是不均勻的:它有一個偏向0,但仍然可以取0或1作爲一個值。

由於在搜索SO上的答案時會產生影響,因此我按照問題回答了問題。但在@ applefreak對他自己的問題的評論中,他似乎也可能正在尋找一個真正的非僞隨機數生成器。 @ JonHanna的回答「那不可能完成」是適當的。使用計算機外部的源可以消除對時鐘的依賴,但它仍然不會是真正的隨機。你可能會認爲沒有什麼是真的,但這是一個哲學問題。