Что касается верхнего ответа, данного в этом посте , я заметил, что он не работает для граничного случая, когда rnd=sum_of_weight
.Исправление состоит в том, чтобы генерировать случайные числа в [0,sum_of_weight)
, однако мне было интересно, почему код не работает для этого граничного случая?Является ли это недостатком алгоритма?
РЕДАКТИРОВАТЬ: Кроме того, необходимо ли сортировать массив весов по убыванию?Похоже, на основе цикла вычитания.
Ниже приведен код Java, который реализует псевдокод в приведенном выше сообщении.
int sum_of_weight = 0;
int []choice_weight = {50, 15, 15, 10, 10}; // percentages
int num_choices = choice_weight.length;
public void init() {
for (int i = 0; i < num_choices; i++) {
sum_of_weight += choice_weight[i];
}
}
int next() {
int rnd = (int)Util.between(0, sum_of_weight);// random(sum_of_weight);
rnd=sum_of_weight; // force the exception by hitting boundary case
//System.out.print("rnd=" + rnd);
for (int i = 0; i < num_choices; i++) {
if (rnd < choice_weight[i])
return i;
rnd -= choice_weight[i];
}
throw new RuntimeException("should never get here for rnd=" + rnd);
}
public static void main(String[] args) {
SimpleWeight sw = new SimpleWeight();
sw.init();
for (int i=0; i < 10;i++) {
System.out.println(sw.next());
}
}