Вернуть случайно или ложно случайно - PullRequest
60 голосов
/ 16 января 2012

Мне нужно создать Java метод для случайного возврата true или false. Как я могу это сделать?

Ответы [ 7 ]

104 голосов
/ 16 января 2012

Класс java.util.Random уже имеет эту функциональность:

public boolean getRandomBoolean() {
    Random random = new Random();
    return random.nextBoolean();
}

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

public class YourClass {

    /* Oher stuff here */

    private Random random;

    public YourClass() {
        // ...
        random = new Random();
    }

    public boolean getRandomBoolean() {
        return random.nextBoolean();
    }

    /* More stuff here */

}
55 голосов
/ 16 января 2012

(Math.random() < 0.5) случайным образом возвращает true или false

14 голосов
/ 16 января 2012

Это должно сделать:

public boolean randomBoolean(){
    return Math.random() < 0.5;
}
5 голосов
/ 16 января 2012

Вы можете сделать как следующий код,

public class RandomBoolean {
    Random random = new Random();
    public boolean getBoolean() {
        return random.nextBoolean();
    }
    public static void main(String[] args) {
        RandomBoolean randomBoolean = new RandomBoolean();
        for (int i = 0; i < 10; i++) {
            System.out.println(randomBoolean.getBoolean());
        }
    }
}

Надеюсь, это поможет вам, спасибо.

2 голосов
/ 03 сентября 2013

Вы получите это следующим образом:

return Math.random() < 0.5;
0 голосов
/ 03 мая 2019

Класс Java Random использует внутренние часы процессора (насколько я знаю).Точно так же можно использовать информацию ОЗУ как источник случайности.Просто откройте диспетчер задач Windows, вкладку «Производительность» и посмотрите на физическую память - доступно: она постоянно меняется;в большинстве случаев значение обновляется примерно каждую секунду, только в редких случаях значение остается постоянным в течение нескольких секунд. Другими значениями, которые изменяются все чаще, являются системные дескрипторы и потоки , но я не нашел команду cmd, чтобы получить их значение.Поэтому в этом примере я буду использовать Доступную физическую память в качестве источника случайности.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public String getAvailablePhysicalMemoryAsString() throws IOException
    {
        Process p = Runtime.getRuntime().exec("cmd /C systeminfo | find \"Available Physical Memory\"");
        BufferedReader in = 
                new BufferedReader(new InputStreamReader(p.getInputStream()));
        return in.readLine();
    }

    public int getAvailablePhysicalMemoryValue() throws IOException
    {
        String text = getAvailablePhysicalMemoryAsString();
        int begin = text.indexOf(":")+1;
        int end = text.lastIndexOf("MB");
        String value = text.substring(begin, end).trim();

        int intValue = Integer.parseInt(value);
        System.out.println("available physical memory in MB = "+intValue);
        return intValue;
    }

    public boolean getRandomBoolean() throws IOException
    {
        int randomInt = getAvailablePhysicalMemoryValue();
        return (randomInt%2==1);
    }


    public static void main(String args[]) throws IOException
    {       
        Main m = new Main();
        while(true)
        {
            System.out.println(m.getRandomBoolean());
        }
    }
}

Как вы можете видеть, основная часть выполняет команду cmd systeminfo, сRuntime.getRuntime().exec().

Ради краткости я опустил операторы try-catch.Я запускал эту программу несколько раз, и никаких ошибок не возникало - всегда есть строка «Доступная физическая память» в выходных данных команды cmd.

Возможные недостатки:

  1. Есть некоторая задержка в выполнении этой программы.Обратите внимание, что в функции main() внутри цикла while(true) отсутствует Thread.sleep(), и все же вывод выводится на консоль только раз в секунду или около того.
  2. Доступная память может бытьконстанта для вновь открытого сеанса ОС - пожалуйста, проверьте.У меня запущено всего несколько программ, и значение меняется каждую секунду.Я предполагаю, что если вы запускаете эту программу в среде сервера, получение разных значений для каждого вызова не должно быть проблемой.
0 голосов
/ 07 апреля 2019

Вы можете использовать следующее для непредвзятого результата:

Random random = new Random();
//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

Примечание: random.nextInt (2) означает, что число 2 является границей.отсчет начинается с 0. Таким образом, у нас есть 2 возможных числа (0 и 1) и, следовательно, вероятность составляет 50%!

Если вы хотите повысить вероятность того, что ваш результат будет истинным (или ложным), вы можетеотрегулируйте вышеперечисленное следующим образом!

Random random = new Random();

//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

//For 25% chance of true
boolean chance25oftrue = (random.nextInt(4) == 0) ? true : false;

//For 40% chance of true
boolean chance40oftrue = (random.nextInt(5) < 2) ? true : false;
...