我不太清楚如何去做這件事。隨機事件
我需要生成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 ...}
我不太清楚如何去做這件事。隨機事件
我需要生成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 ...}
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;
如果你總是將整數百分數的值填入數組中,我會根據概率值填充一個100個元素的數組,因此在這種情況下,您的數組將有55次出現18次,出現次數爲1次,並且15次出現17.然後,您只需從該數組中選擇14,296個隨機值。 (即,選取[0,100)範圍內的整數並取該元素。)
對於表達概率的不同方式,當然有不同的方法。但是如果給出整數百分比,這是一個容易理解的選項。 (另一種方法是將總數的所有概率縮放,即在[0,1)範圍內,然後在該範圍內隨機取兩倍)。
將隨機發生器的範圍劃分爲比例段,並判斷下一個隨機數落入哪個段,從中選擇相應的數字。
喜歡的東西(簡體):
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%。
你可以填充List<T>
與各3個數字的適當數量,然後randomize the List。
如何像這樣(未經):
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;
}
}
是的,解決方案。 – vines
爲了澄清,輸入爲1)的一組數字中的每個具有相關聯的期望概率,和2)所希望的輸出的陣列大小? – JYelton
輸入正確輸出是一個大小爲N的數組,具有N/a。概率元素的值爲 –
這麼多好的答案,我實際上不知道這次選擇哪一個! –