Итак, скажем, у нас есть блок кода, который мы хотим выполнить 70% раз и еще один 30% раз.
if(Math.random() < 0.7)
70percentmethod();
else
30percentmethod();
Прост достаточно. Но что, если мы хотим, чтобы он был легко расширяемым, чтобы сказать, 30%/60%/10% и т.д.? Здесь потребовалось бы добавление и изменение всех операторов if, которые не очень удобны в использовании, медленных и ошибок.
До сих пор я нашел большие ключи для приличного использования для этого варианта использования, например:
switch(rand(0, 10)){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:70percentmethod();break;
case 8:
case 9:
case 10:30percentmethod();break;
}
Который может быть очень легко изменен на:
switch(rand(0, 10)){
case 0:10percentmethod();break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:60percentmethod();break;
case 8:
case 9:
case 10:30percentmethod();break;
}
Но у них также есть свои недостатки, громоздкие и разбитые на предопределенное количество делений.
Что-то идеальное было бы основано на системе "частотного номера", я думаю, так:
(1,a),(1,b),(2,c) -> 25% a, 25% b, 50% c
то если вы добавили еще один:
(1,a),(1,b),(2,c),(6,d) -> 10% a, 10% b, 20% c, 60% d
Таким образом, просто добавляя числа, делая сумму равной 100%, а затем разделите ее.
Я полагаю, что было бы нелегко сделать обработчик для него с помощью настроенного хэш-карты или что-то в этом роде, но мне интересно, существует ли какой-то установленный способ/шаблон или лямбда для него, прежде чем я пойду на все спагетти.