2011-08-10 81 views
3

我不太清楚如何去做這件事。隨機事件

我需要生成14296個具有不同概率級別的隨機數。

因此,例如我需要一個包含數字18,1和17的數組。每個數字具有不同的發生百分比概率。所以:

55%= 18
(7,862.8次)

30%= 1
(4,288.8次)

15%= 17
(2,144.4次)

結果會像新Array(){18,18,1,17,1,18 ...}

+0

爲了澄清,輸入爲1)的一組數字中的每個具有相關聯的期望概率,和2)所希望的輸出的陣列大小? – JYelton

+0

輸入正確輸出是一個大小爲N的數組,具有N/a。概率元素的值爲 –

+0

這麼多好的答案,我實際上不知道這次選擇哪一個! –

回答

1
Random r = new Random(); 

// for each number to generate 
int nextNumber; 
double probability = r.NextDouble(); 
if (probability < 55.0/100.0) 
    nextNumber = 18; 
else if (probability < (55.0 + 30.0)/100.0) 
    nextNumber = 1; 
else 
    nextNumber = 17; 
4

如果你總是將整數百分數的值填入數組中,我會根據概率值填充一個100個元素的數組,因此在這種情況下,您的數組將有55次出現18次,出現次數爲1次,並且15次出現17.然後,您只需從該數組中選擇14,296個隨機值。 (即,選取[0,100)範圍內的整數並取該元素。)

對於表達概率的不同方式,當然有不同的方法。但是如果給出整數百分比,這是一個容易理解的選項。 (另一種方法是將總數的所有概率縮放,即在[0,1)範圍內,然後在該範圍內隨機取兩倍)。

2

將隨機發生器的範圍劃分爲比例段,並判斷下一個隨機數落入哪個段,從中選擇相應的數字。

喜歡的東西(簡體):

const int numbers[3] = { 1, 17, 18 }; 
const int borders[2] = { 0.30*MAX_RANDOM, (0.30 + 0.15) * MAX_RANDOM }; 

int i = random.next(), num; 

if  (i < borders[0]) num = number[0]; 
else if (i < borders[0]) num = number[1]; 
else num = number[2]; 

當然,如果有超過三個的更多的數字,最好是使用一個循環。注意:與Jon Skeet的解決方案不同,這個可以提供高達1 /(MAX_RANDOM + 1)(通常在32位機器上高達2^32)的任何期望的粒度,而不是嚴格的1%。

1

如何像這樣(未經):

struct np 
{ 
    int n; 
    int p; 
} 

創建List<np>與價值/百分比對(例如,n = 18, p = 55)將它。

然後,只需執行以下操作來選擇一個號碼:

List<np> npl = new List<np>(); 
// (fill the list here) 



int r = rnd.next(total_of_all_p_values); // get random number 
int res = 0; // result 
for(int i = 0; i < npl.Length(); r -= npl[i++].n) 
{ 
    if(r < npl[i].p) // remaining vlaue is smaller than current percentage 
    { 
     res = npl[i].n; 
     break; 
    } 
} 
+0

是的,解決方案。 – vines