#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. Затем вы можете использовать это для выполнения выбора.