【问题标题】:Return True or False Randomly随机返回真假
【发布时间】:2012-02-11 06:38:04
【问题描述】:

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

【问题讨论】:

    标签: java random boolean


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      (Math.random() < 0.5) 随机返回真假

      【讨论】:

        【解决方案3】:

        应该这样做:

        public boolean randomBoolean(){
            return Math.random() < 0.5;
        }
        

        【讨论】:

          【解决方案4】:

          您可以使用以下代码

          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());
                  }
              }
          }
          

          【讨论】:

          • 这有点多余。 randomBoolean 可能只是 new Random(),而不是 getBoolean()nextBoolean()。上面的代码只是添加了一个毫无意义的类包装。
          【解决方案5】:

          你会得到它:

          return Math.random() < 0.5;
          

          【讨论】:

          • 尽可能尝试仅添加添加信息的答案。这个答案与 MichaelBorgwardt 的答案几乎相同
          【解决方案6】:

          您可以使用以下方法获得公正的结果:

          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;
          

          【讨论】:

          • 我不知道,但我会更好地阅读类似的内容://For 40% chance of true boolean chance40oftrue = (random.nextInt(100) &lt; 40);
          【解决方案7】:

          Java 的Random 类利用了CPU 的内部时钟(据我所知)。类似地,可以使用 RAM 信息作为随机性来源。只需打开 Windows 任务管理器的性能选项卡,然后查看物理内存 - 可用:它不断变化;大多数情况下,该值大约每秒更新一次,只有在极少数情况下,该值会在几秒钟内保持不变。 其他更频繁更改的值是系统句柄和线程,但我没有找到cmd 命令来获取它们的值。所以在这个例子中,我将使用 Available Physical Memory 作为随机源。

          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. 对于新打开的操作系统会话,可用内存可能是恒定的 - 请验证。我只运行了几个程序,并且值每秒都在变化。我想如果你在服务器环境中运行这个程序,每次调用获取不同的值应该不是问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-07
            • 2014-08-29
            • 2012-07-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-14
            相关资源
            最近更新 更多