Подтвердить что ты не робот

Вероятность в Java

Мне было любопытно узнать, как мне реализовать вероятность на Java? Например, если вероятность отображения переменной равна 1/25, то как мне это реализовать? Или любая другая вероятность? Пожалуйста, укажите мне в общем направлении.

4b9b3361

Ответ 1

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

Итак, дано:

boolean val = new Random().nextInt(25)==0;

val будет иметь вероятность 1/25 быть истинным (так как nextInt() имеет четную вероятность возврата любого числа, начинающегося с 0 и вплоть до 25, но не включая).

Вы, конечно же, должны были бы import java.util.Random;.

Как указано ниже, если вы получаете более одного случайного числа, было бы более эффективно повторно использовать объект Random, а не воссоздавать его все время:

Random rand = new Random();
boolean val = rand.nextInt(25)==0;

..

boolean val2 = rand.nextInt(25)==0;

Ответ 2

Обычно используется генератор случайных чисел. Большинство из них возвращают число в интервале [0,1], чтобы затем проверить, является ли это число <= 0,04 или нет.

if( new Random().nextDouble() <= 0.04 ) {  //you might want to cache the Random instance
   //we hit the 1/25 ( 4% ) case.
}

Или

if( Math.random() <= 0.04 ) {
  //we hit the 1/25 ( 4% ) case.
}

Обратите внимание, что существует множество генераторов случайных чисел, которые имеют разные свойства, но для простых приложений класс Random должен быть достаточным.

Ответ 3

Начиная с 1.7 лучше использовать (хотя бы в параллельной среде):

ThreadLocalRandom.current().nextInt(25) == 0

Javadoc

Генератор случайных чисел, выделенный для текущего потока. Подобно глобальному генератору случайных чисел, используемому классом Math, ThreadLocalRandom инициализируется внутренним сгенерированным семенем, которое иначе не может быть изменено. Когда это применимо, использование ThreadLocalRandom, а не общих случайных объектов в параллельных программах, как правило, сталкивается с гораздо меньшими накладными расходами и конфликтами. Использование ThreadLocalRandom особенно подходит, когда несколько задач (например, каждый из ForkJoinTask) используют случайные числа параллельно в пулах потоков. Использования этого класса обычно должны иметь вид: ThreadLocalRandom.current(). NextX (...) (где X - Int, Long и т.д.). Когда все обычаи имеют эту форму, никогда невозможно случайно поделиться ThreadLocalRandom по нескольким потокам.

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

Ответ 4

В Java есть класс под названием java.util.Random, который может генерировать случайные числа. Если вы хотите, чтобы что-то случилось с вероятностью 1/25, просто создайте случайное число между 1 и 25 (или 0 и 24 включительно) и проверьте, равно ли это число 1.

if(new java.util.Random().nextInt(25)==0){
    //Do something.
}

Ответ 5

Возможно, вы можете реализовать это с генерацией случайных чисел.

  Random rn = new Random();
    double d = rn.nextDouble();     // random value in range 0.0 - 1.0
    if(d<=0.04){
    doSomeThing();
    }