Как выбрать случайное число в пределах диапазона, но взвешенное по отношению к одной части этого диапазона?(на Java) - PullRequest
3 голосов
/ 30 марта 2012

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

  1. Выберите случайное число от 1 до 10
  2. Вес это так, что 1-5 может быть на 20% более вероятно, чем 6-10

Возможно ли это? Как бы я это сделал?

Ответы [ 4 ]

11 голосов
/ 30 марта 2012

Это зависит от того, как вы хотите, чтобы ваше распределение вероятностей выглядело.

Например:

Pick a random number between 1-10
If it is <= 6
    Return a random number between 1-5
Else
    Return a random number between 6-10
EndIf

Выбирает число в 1-5 60% времени и число в6-10 40% времени.

1 голос
/ 30 марта 2012

Чтобы сгенерировать кривую вероятностей, бросьте и сложите несколько кубиков. Затем вычтите среднее. Повторно бросьте, если результат отрицательный. Чем больше выпало кубиков, тем больше веса.

Вот один из способов, полностью не проверенный.

float sum;
do {
   sum = rollThreeDice(); // returns 3 to 18, with an average is 10.5
   sum -= 10.5;           // Now the range is 0 to 7.5, with the lower end being more likely.
   } while(sum < 0);
return sum;

Конечно, вы можете бросать кости с любым количеством сторон, чтобы получить желаемый диапазон. Вы управляете частотной кривой, выбирая количество кубиков.

0 голосов
/ 30 марта 2012

Попробуйте это:

public int weightedRandom() {
  int rand = Math.floor(Math.random() * 5 + 1) // From 1 to 5
  if (Math.random() >= 0.6) {
    ++rand;
  }
  return rand;
}
0 голосов
/ 30 марта 2012

На ум приходят два решения. Во-первых, запустите случайный дважды:

java.utils.Random randomGenerator = new java.utils.Random();
int random = randomGenerator.nextInt(11);
if(random <= 6) { //This is 20% more
    random = randomGenerator.nextInt(5) + 1;
} else {
    random = randomGenerator.nextInt(5) + 6;
}

Или, если у вас всегда есть статический диапазон, вы можете заполнить массив числами, добавив больше чисел, которых вы хотите больше, и выбрать случайное число по длине массива.

...