I have a scenario where I need to show the user a different page for the same URL based on the probability distribution,
so, for example, for 3 pages the distribution may be
page 1 - 30% of all users
page 2 - 50% of all users
page 3 - 20% of all users
When you decide which page to load for a given user, which technique can I use to ensure that the overall distribution matches the above?
I think I need a way to select an object in "random" from the set X {x1, x2 .... xn}, except that instead of all objects being equally likely, the probability of choosing the object in advance is determined.
Thanks for putting everyone in, after creating the prototype, this is what I ended up using
private static int RandomIndexWithPercentage(Random random, int[] percentages) {
if (random == null) {
throw new ArgumentNullException("random");
}
if (percentages == null || percentages.Length == 0) {
throw new ArgumentException("percentages cannot be null or empty", "percentages");
}
if(percentages.Sum() != 100) {
throw new ArgumentException("percentages should sum upto 100");
}
if (percentages.Any(n => n < 0)) {
throw new ArgumentException("percentages should be non-negative");
}
var randomNumber = random.Next(100);
var sum = 0;
for (int i = 0; i < percentages.Length; ++i) {
sum += percentages[i];
if (sum > randomNumber) {
return i;
}
}
throw new Exception("Unexpected");
}