Случайное логическое значение с весом или смещением - программирование
Подтвердить что ты не робот

Случайное логическое значение с весом или смещением

Мне нужно сгенерировать некоторые случайные булевы. Однако мне нужно указать вероятность возврата 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-вероятности).

4b9b3361

Ответ 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;
}