我正在研究一個涉及將電話轉接到多個目的地的項目。計算百分比分配中的下一個項目
例如,我想:呼叫
- 10%去目的地的呼叫的
- 20%去目的地乙呼叫
- 30%去目的地Ç 電話
- 40%去到目的地d
目的地的數量及比例必須是可配置的。
我一直在思考如何做到這一點,電子表格和一些代碼打過來,我想出了這個:
對於每個目標,採取隨機數,由乘以百分比,然後選擇號碼最高的目的地。就像這樣:
Item: RANDOM * PERCENTAGE = RESULT
A: 48 * 10 = 480
B: 33 * 20 = 660
C: 81 * 30 = 2430 <--- Highest number, select C
D: 5 * 40 = 200
我想我的工作了作爲d顯然是選擇最多,其次是C,那麼B,和最全A的
但它不工作。如果我這樣做5000次,並計算時代的實際百分比選擇的每個目的地時,我得到這個:電話
- 1%去目的地的呼叫的
- 12%去目的地B.呼叫
- 31%去目的地的C調用的
- 56%去目的地d
這裏是我用來測試本的代碼:
// Initialise item weighting percentages
Dictionary<string, int> weighting = new Dictionary<string, int>();
weighting["A"] = 10; //10%
weighting["B"] = 20; //20%
weighting["C"] = 30; //30%
weighting["D"] = 40; //40% (total = 100%)
// Initialise data set used for each iteration
Dictionary<string, int> data = new Dictionary<string, int>();
// Initialise counts of the selected items
Dictionary<string, int> count = new Dictionary<string, int>();
count["A"] = 0;
count["B"] = 0;
count["C"] = 0;
count["D"] = 0;
Random rand = new Random();
// Loop 5000 times
for (int i = 0; i < 5000; i++) {
// For each item, get a random number between 0 and 99
// and multiply it by the percentage to get a
// weighted random number.
data["A"] = rand.Next(100) * weighting["A"];
data["B"] = rand.Next(100) * weighting["B"];
data["C"] = rand.Next(100) * weighting["C"];
data["D"] = rand.Next(100) * weighting["D"];
// Find which item came out on top and increment the count
string sel = data.First(x => x.Value == data.Max(y => y.Value)).Key;
count[sel]++;
// Log, so you can see whats going on...
if (i < 15)
Console.WriteLine("A:{0:00000} B:{1:00000} C:{2:00000} D:{3:00000} SELECTED:{4}",
data["A"], data["B"], data["C"], data["D"], sel);
else if (i == 15) Console.WriteLine("...");
}
// Output the results, showing the percentage of the number
// occurrances of each item.
Console.WriteLine();
Console.WriteLine("Results: ");
Console.WriteLine(" A = {0}%", 100 * ((double)count["A"]/(double)count.Sum(z => z.Value)));
Console.WriteLine(" B = {0}%", 100 * ((double)count["B"]/(double)count.Sum(z => z.Value)));
Console.WriteLine(" C = {0}%", 100 * ((double)count["C"]/(double)count.Sum(z => z.Value)));
Console.WriteLine(" D = {0}%", 100 * ((double)count["D"]/(double)count.Sum(z => z.Value)));
的results是:
A:00780 B:00300 C:01740 D:03680 SELECTED:D
A:00600 B:00660 C:00060 D:03400 SELECTED:D
A:00900 B:01880 C:00510 D:00720 SELECTED:B
A:00260 B:01380 C:00540 D:01520 SELECTED:D
A:00220 B:01960 C:00210 D:02080 SELECTED:D
A:00020 B:01400 C:01530 D:00120 SELECTED:C
A:00980 B:00400 C:01560 D:03280 SELECTED:D
A:00330 B:00300 C:01500 D:03680 SELECTED:D
A:00590 B:00460 C:02730 D:02400 SELECTED:C
A:00580 B:01900 C:02040 D:01320 SELECTED:C
A:00620 B:01320 C:00750 D:01760 SELECTED:D
A:00320 B:01040 C:01350 D:03640 SELECTED:D
A:00340 B:01520 C:02010 D:03880 SELECTED:D
A:00850 B:01420 C:00480 D:03400 SELECTED:D
A:00560 B:00680 C:00030 D:00000 SELECTED:B
...
Results:
A = 1.44%
B = 11.54%
C = 30.6%
D = 56.42%
任何人都可以提出一個方法來解決這個問題,做到真正的百分比出來的配置?
而對於加分,任何人都可以提出一個方法做類似的但不使用隨機數的東西,所以選擇目的地的順序明確的規定。用上面的例子會輸出這個序列每次:
ABCDBCDCDD ABCDBCDCDD ABCDBCDCDD ABCDBCDCDD ...
(注意順序均勻分佈)
感謝。 Ben
任何人都可以用編輯權限解決這個代碼格式化我嗎?我無法弄清楚什麼是錯的!它全部縮進4個空格... – BG100 2010-09-03 08:33:59
@BG:請在自己的段落中使用'----',而不是'
'來插入水平線。 – kennytm 2010-09-03 08:35:42
完美...謝謝。 – BG100 2010-09-03 08:38:54