Элегантный способ генерировать случайное значение в процентах?

У меня есть значения N (целые числа). Я хотел бы знать, каков самый элегантный способ случайного выбора одного из этих значений в процентах. Например, для примера с 3 значениями:

  • Значение 1 имеет 30% шанс быть выбранным
  • Значение 2 имеет 12% шанс быть выбранным
  • Значение 3 имеет 45% шанс быть выбранным

Мне нужно это для программы, которую я разрабатываю на Java, но алгоритм псевдокода или код на любом другом языке будет в порядке.


person nathan    schedule 01.10.2012    source источник
comment
pick one of those values regarding a percentage - не понял это предложение..   -  person Rohit Jain    schedule 01.10.2012
comment
30 + 12 + 45 равно 87. А остальные 13?   -  person David Grant    schedule 01.10.2012


Ответы (2)


Один из способов сделать это без вычисления значений для использования:

double d = Math.random() * 100;
if ((d -= 30) < 0) return 1;
if ((d -= 12) < 0) return 2;
if ((d -= 45) < 0) return 3;
return 4;
person Peter Lawrey    schedule 01.10.2012
comment
Великолепно! Спасибо чувак. - person Can Bayar; 02.06.2021

Предлагаемый алгоритм:

  • сгенерировать случайное число (n) между 0 и 1 (при условии, что ваш генератор случайных чисел хорошо распределен)
  • если n < 0.30 возвращает значение 1
  • если n < 0.42 возвращает значение 2
  • иначе если n < 0.87 возвращает значение 3
  • иначе скажите «Привет» (ваши числа не дают в сумме 100%)
person assylias    schedule 01.10.2012
comment
Не else, а else if, потому что 30 + 12 + 45 < 100. - person sp00m; 01.10.2012
comment
используйте new Random().nextInt(87) и добавьте 1 к результату (или уменьшите на один шаг if) - для улучшения выбора используйте 45, 30, 12 порядок - person cl-r; 01.10.2012
comment
@assylias, может быть, вы хотели написать, если n ‹ 0,30, ИНАЧЕ, если n ‹ 0,42...? - person nathan; 01.10.2012
comment
@nathan - я думаю, мы можем предположить, что любой, кто читает это, достаточно умен, чтобы понять это самостоятельно. - person Stephen C; 01.10.2012
comment
@StephenC серьезно? даже в английском if и else if означают две разные вещи. Я просто спрашиваю, если второе, если не должно быть еще, если - person nathan; 01.10.2012
comment
@nathan Вопрос, помеченный как java, кажется довольно интуитивным, что return value 1 выйдет из всего блока if/else if. - person assylias; 01.10.2012