using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
// 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)));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpc2UgaXRlbSB3ZWlnaHRpbmcgcGVyY2VudGFnZXMKICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gd2VpZ2h0aW5nID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+KCk7CiAgICAgICAgICAgIHdlaWdodGluZ1siQSJdID0gMTA7IC8vMTAlCiAgICAgICAgICAgIHdlaWdodGluZ1siQiJdID0gMjA7IC8vMjAlCiAgICAgICAgICAgIHdlaWdodGluZ1siQyJdID0gMzA7IC8vMzAlCiAgICAgICAgICAgIHdlaWdodGluZ1siRCJdID0gNDA7IC8vNDAlICh0b3RhbCA9IDEwMCUpCgogICAgICAgICAgICAvLyBJbml0aWFsaXNlIGRhdGEgc2V0IHVzZWQgZm9yIGVhY2ggaXRlcmF0aW9uCiAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IGRhdGEgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGludD4oKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpc2UgY291bnRzIG9mIHRoZSBzZWxlY3RlZCBpdGVtcwogICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBjb3VudCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpOwogICAgICAgICAgICBjb3VudFsiQSJdID0gMDsKICAgICAgICAgICAgY291bnRbIkIiXSA9IDA7CiAgICAgICAgICAgIGNvdW50WyJDIl0gPSAwOwogICAgICAgICAgICBjb3VudFsiRCJdID0gMDsKCiAgICAgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwoKICAgICAgICAgICAgLy8gTG9vcCA1MDAwIHRpbWVzCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwMDsgaSsrKSB7CgogICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggaXRlbSwgZ2V0IGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5CiAgICAgICAgICAgICAgICAvLyBhbmQgbXVsdGlwbHkgaXQgYnkgdGhlIHBlcmNlbnRhZ2UgdG8gZ2V0IGEKICAgICAgICAgICAgICAgIC8vIHdlaWdodGVkIHJhbmRvbSBudW1iZXIuCiAgICAgICAgICAgICAgICBkYXRhWyJBIl0gPSByYW5kLk5leHQoMTAwKSAqIHdlaWdodGluZ1siQSJdOwogICAgICAgICAgICAgICAgZGF0YVsiQiJdID0gcmFuZC5OZXh0KDEwMCkgKiB3ZWlnaHRpbmdbIkIiXTsKICAgICAgICAgICAgICAgIGRhdGFbIkMiXSA9IHJhbmQuTmV4dCgxMDApICogd2VpZ2h0aW5nWyJDIl07CiAgICAgICAgICAgICAgICBkYXRhWyJEIl0gPSByYW5kLk5leHQoMTAwKSAqIHdlaWdodGluZ1siRCJdOwoKICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hpY2ggaXRlbSBjYW1lIG91dCBvbiB0b3AgYW5kIGluY3JlbWVudCB0aGUgY291bnQKICAgICAgICAgICAgICAgIHN0cmluZyBzZWwgPSBkYXRhLkZpcnN0KHggPT4geC5WYWx1ZSA9PSBkYXRhLk1heCh5ID0+IHkuVmFsdWUpKS5LZXk7CiAgICAgICAgICAgICAgICBjb3VudFtzZWxdKys7CgogICAgICAgICAgICAgICAgLy8gTG9nLCBzbyB5b3UgY2FuIHNlZSB3aGF0cyBnb2luZyBvbi4uLgogICAgICAgICAgICAgICAgaWYgKGkgPCAxNSkKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQTp7MDowMDAwMH0gIEI6ezE6MDAwMDB9ICBDOnsyOjAwMDAwfSAgRDp7MzowMDAwMH0gIFNFTEVDVEVEOns0fSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbIkEiXSwgZGF0YVsiQiJdLCBkYXRhWyJDIl0sIGRhdGFbIkQiXSwgc2VsKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMTUpIENvbnNvbGUuV3JpdGVMaW5lKCIuLi4iKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE91dHB1dCB0aGUgcmVzdWx0cywgc2hvd2luZyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgbnVtYmVyCiAgICAgICAgICAgIC8vIG9jY3VycmFuY2VzIG9mIGVhY2ggaXRlbS4KICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJlc3VsdHM6ICIpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAgIEEgPSB7MH0lIiwgMTAwICogKChkb3VibGUpY291bnRbIkEiXSAvIChkb3VibGUpY291bnQuU3VtKHogPT4gei5WYWx1ZSkpKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgICBCID0gezB9JSIsIDEwMCAqICgoZG91YmxlKWNvdW50WyJCIl0gLyAoZG91YmxlKWNvdW50LlN1bSh6ID0+IHouVmFsdWUpKSk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgICAgQyA9IHswfSUiLCAxMDAgKiAoKGRvdWJsZSljb3VudFsiQyJdIC8gKGRvdWJsZSljb3VudC5TdW0oeiA9PiB6LlZhbHVlKSkpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAgIEQgPSB7MH0lIiwgMTAwICogKChkb3VibGUpY291bnRbIkQiXSAvIChkb3VibGUpY291bnQuU3VtKHogPT4gei5WYWx1ZSkpKTsKCX0KfQ==