Как сгенерировать случайное число на основе вероятности в Java

#java #sampling

#java #выборка

Вопрос:

Я хочу случайным образом выбирать ‘1’ в 10% случаев, ‘2’ в 30% случаев и ‘3’ в остальные 60% случаев. Мне интересно, существует ли метод, который позволяет мне выполнять случайную выборку на основе этих вероятностей в Java.

Спасибо

Комментарии:

1. «Случайное число, основанное на вероятности» — Разве это не то, что случайные числа в любом случае (не вдаваясь в технические подробности)?

2. вы могли бы сгенерировать случайное число от 1 до 100. Затем, если результат равен 1-10, верните 1, если результат находится между 10-40, верните 2, и если результат больше 40, верните 3.

3. используйте массив { 1, 2, 2, 2, 3, 3, 3, 3, 3, 3 } или список, перемешайте и выберите одно

4. Генератор случайных чисел в Java случайным образом выбирает значение int с каждым целым числом в пределах диапазона, чтобы иметь равную вероятность выбора. Я хочу изменить эту вероятность выбора на 10%, 30% и 60%. Я знаю, что есть функция для этого в R. Но я не могу найти это в Java. Я спрашиваю, знает ли кто-нибудь о методе.

5. Делайте то, что сказали ребята выше, и используйте случайное число от 1 до 100, чтобы определить, какое из них выбрать.

Ответ №1:

Сначала сгенерируйте double, равномерно распределенный между 0.0 и 1.0. Затем разделите диапазон (0.0 < x < 1.0) на поддиапазоны, соответствующие вашим желаемым вероятностям:

  • 0.0 <= x < 0.1 становится 1 (ширина интервала равна (0.1 — 0.0) = 0.1, или 10%);
  • 0.1 <= x < 0.4 становится 2 (ширина интервала равна (0.4 — 0.1) = 0.3, или 30%);
  • 0.4 <= x < 1.0 становится 3 (ширина интервала равна (1.0 — 0.4) = 0.6, или 60%).

В коде:

 double rand = rng.nextDouble();
if (rand < .1) {
  return 1;
} else if (rand < .1   .3) {
  return 2;
} else {
  return 3;
}
  

(где rng является экземпляром java.util.Random .)

Этот метод можно легко обобщить на произвольный набор целевых вероятностей.

Комментарии:

1. Вы имели в виду .3 для «30% времени» , для вычисляемого значения .1 .3 = .4 , оставляя .6 диапазон до 1.0 для последних «60% времени» .

Ответ №2:

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

 Random rand = new Random();
int r = rand.nextInt(10000000);
int m = r % 10;
if (m < 1) return 1; // 10 %
else if (m < 4) return 2; // 30 %
else return 3; // 60 %
  

Ответ №3:

В стандарте Java API нет метода. Вы можете написать свой собственный алгоритм, вы можете попробовать использовать метод MockNeat.probabilities(), который делает именно то, что вы просите.

Например:

 String s = mockNeat.probabilites(String.class)
                .add(0.1, "A") // 10% chance to pick "A"
                .add(0.2, "B") // 20% chance to pick "B"
                .add(0.5, "C") // 50% chance to pick "C"
                .add(0.2, "D") // 20% chance to pick "D"
                .val();
  

Отказ от ответственности: Я являюсь автором библиотеки, поэтому я могу быть предвзятым, когда рекомендую ее.

Ответ №4:

Я не думаю, что для этого есть метод, вам просто нужно будет выполнить обходной путь, подобный следующему

Сгенерируйте случайное число от 1 до 10 включительно, а затем выберите 1,2 или 3 в зависимости от вероятности случайного шанса.

 if (random_number == 1)
{
  result = 1;
}
else if (random_number <= 4)
{
  result = 2;
}
else
{
result = 3;
}
  

Комментарии:

1. Есть метод. nextDouble вернет равномерно распределенное число от 0 до 1.0. Затем вы можете использовать это для выполнения выбора.