随机返回True或False

73

我需要创建一个Java方法来随机返回truefalse。怎么做呢?

8个回答

133

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 */

}

69

(Math.random() < 0.5) 随机返回 true 或 false


20
这样应该可以:
public boolean randomBoolean(){
    return Math.random() < 0.5;
}

5
您可以使用以下代码。
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
这有点冗余。randomBoolean 可以直接是 new Random(),而不是 getBoolean(),可以使用 nextBoolean()。上面的代码只是添加了一个无意义的类包装。 - whitfin

3

通过这种方式,您可以获得它:

return Math.random() < 0.5;

8
尽可能只添加能增加信息的回答。此答案与Michael Borgwardt的答案非常相似。 - Richard Tingle

1

ThreadLocalRandom.current().nextBoolean()

为了避免重复创建Random对象,请使用{{link1:ThreadLocalRandom}}。每个线程只有一个这样的对象。
boolean rando = ThreadLocalRandom.current().nextBoolean() ;

那段代码非常简短易记,你不需要像问题中要求的那样创建一个专门的方法。

0

Java的Random类利用了CPU的内部时钟(据我所知)。同样,我们可以使用RAM信息作为随机源。只需打开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

您可以使用以下内容获得无偏差的结果:

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%!

如果您希望将结果更多地倾向于true或false,则可以按如下方式进行调整!

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;

我不确定,但是我认为这样写更好一些://表示40%的几率为真 boolean chance40oftrue = (random.nextInt(100) < 40); - Patrice M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接