У меня есть сценарий, в котором мне нужно показать пользователю другую страницу для того же URL-адреса на основе распределения вероятностей,
так, например, для 3 страниц распространение может быть
page 1 - 30% of all users
page 2 - 50% of all users
page 3 - 20% of all users
При принятии решения о том, какую страницу загрузить для данного пользователя, какую технику я могу использовать, чтобы обеспечить соответствие общего распространения вышеуказанному?
Я думаю, мне нужен способ выбрать объект "случайным образом" из набора X {x1, x2 .... xn}, за исключением того, что вместо всех объектов с одинаковой вероятностью определяется вероятность выбора объекта. заранее.
Спасибо всем за участие, после создания прототипа, это то, что я в итоге использовал
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;
}
}
//This should not be reached, because randomNumber < 100 and sum will hit 100 eventually
throw new Exception("Unexpected");
}