Случайное логическое значение с весом или смещением
Мне нужно сгенерировать некоторые случайные булевы. Однако мне нужно указать вероятность возврата true
. Как результат:
private Random random = new Random();
random.nextBoolean();
не будет работать.
Одно из возможных решений:
private Random random = new Random()
public boolean getRandomBoolean(float p){
return random.nextFloat() < p;
}
Мне было интересно, есть ли лучший или более естественный способ сделать это.
EDIT:
Я предполагаю, что я спрашиваю, есть ли класс библиотеки, который предоставляет метод nextBoolean (float-вероятности).
Ответы
Ответ 1
Мне было интересно, есть ли лучший или более естественный способ сделать это.
Подход, который вы используете, уже подойдет.
* Насколько я знаю, нет стандартного метода Java, который сделает этот код короче.
* Для не криптографических целей.
Ответ 2
1) Да, я думаю, что ваш подход действителен, и я не вижу другого более простого способа.
2) Существует библиотека для обработки случайных чисел различных статистических распределений:
http://introcs.cs.princeton.edu/java/22library/StdRandom.java.html
Ответ 3
Вот что я использую. Очень похоже на ответ FracturedRetina.
Random random = new Random();
// 20% chance
boolean true20 = (random.nextInt(5) == 0) ? true : false;
// 25% chance
boolean true25 = (random.nextInt(4) == 0) ? true : false;
// 40% chance
boolean true40 = (random.nextInt(5) < 2) ? true : false;
Ответ 4
Библиотека MockNeat реализует эту функцию.
Пример для генерирования логического значения, которое имеет 99,99% от истины:
MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();
Ответ 5
public boolean getBiasedRandom(int bias) {
int c;
Random t = new Random();
// random integers in [0, 100]
c=t.nextInt(100);
if (c>bias){return false;
}
else{return true;}
}
Этот процент основан на процентах...
Ответ 6
Расширение на user2495765 ответ,
вы можете сделать функцию, которая принимает коэффициент ввода (в качестве двух значений: диапазон: см. код)
public class MyRandomFuncs {
public Random rand = new Random();
boolean getBooleanAsRatio(int chance, int range) {
int c = rand.nextInt(range + 1);
return c > chance;
}
}
В зависимости от того, что вы намереваетесь сделать, вы, вероятно, не хотите инициализировать Random из вашего метода, а скорее используете в качестве переменной класса (как в коде выше) и вызываете nextInt() из вашей функции.
Ответ 7
Ваш путь, вероятно, лучше, код по-гольф, но другой способ сделать это выглядит следующим образом:
public boolean getRandomBoolean() {
Random random = new Random();
//For 1 in 5
int chanceOfTrue = 5;
if (random.nextInt(chanceOfTrue) == 0) {
return true;
} else {
return false;
}
}
Или для 2 из 5 попробуйте следующее:
public boolean getRandomBoolean() {
Random random = new Random();
//For 2 in 5
int chanceOfTrue = 5;
int randInt = random.nextInt(chanceOfTrue);
if (randInt == 0 || randInt == 1) {
return true;
} else {
return false;
}
}
Ответ 8
Случайный объект должен быть уже инициализирован.
public static boolean flipRandom(double probability) {
Validate.isBetween(probability, 0, 1, true);
if(probability == 0)
return false;
if(probability == 1)
return true;
if(probability == 0.5)
return random.nextBoolean();
return random.nextDouble() < probability ? true : false;
}