【问题标题】:How Do I get a Random Variable Based on Time in Java如何在Java中获得基于时间的随机变量
【发布时间】:2015-09-26 01:44:02
【问题描述】:

我正在尝试制作一个在 1 和 0 之间选择随机数的程序。但是,当我运行该程序时,我一遍又一遍地得到相同的输出(20 次!)。我该如何解决这个问题?我听说Math.random()random() 更有偏见。

这是我的代码:

public class Startup {

    public static void main(String[] args) {
        double match = Math.random();

        for(int i = 0; i <= 20; i++){
            if(match < 0.05){
                System.out.println("a");
            }
            else if(0.05 <= match && match <= 0.1){
                System.out.println("b");
            }
            else if(0.1 < match && match <= 0.15){
                System.out.println("c");
            }
            else if(0.15 < match && match <= 0.2){
                System.out.println("d");
            }
            else if(0.2 < match && match <= 0.25){
                System.out.println("e");
            }
            else if(0.25 < match && match <= 0.3){
                System.out.println("f");
            }
            else if(0.3 < match && match <= 0.35){
                System.out.println("g");
            }
            else if(0.35 < match && match <= 0.4){
                System.out.println("h");
            }
            else if(0.35 < match && match <= 0.4){
                System.out.println("i");
            }
            else if(0.4 < match && match <= 0.45){
                System.out.println("j");
            }
            else if(0.45 < match && match <= 0.5){
                System.out.println("k");
            }
            else if(0.5 < match && match <= 0.55){
                System.out.println("l");
            }
            else if(0.55 < match && match <= 0.6){
                System.out.println("m");
            }
            else if(0.6 < match && match <= 0.65){
                System.out.println("n");
            }
            else if(0.65 < match && match <= 0.7){
                System.out.println("o");
            }
            else if(0.7 < match && match <= 0.75){
                System.out.println("p");
            }
            else if(0.75 < match && match <= 0.8){
                System.out.println("q");
            }
            else if(0.8 < match && match <= 0.85){
                System.out.println("r");
            }
            else if(0.85 < match && match <= 0.9){
                System.out.println("s");
            }
            else if(0.9 < match && match <= 0.95){
                System.out.println("t");
            }
            else if(0.95 < match && match <= 1){
                System.out.println("u");
            }
        }
    }
}

【问题讨论】:

  • 但是,当我运行程序时,我一遍又一遍地得到相同的输出(20 次!)我不相信你。
  • 其实我跑了,它返回1 21次,但这不是我问题的重点。
  • 我猜你可以never be sure。我的猜测是fair dice roll
  • 双重匹配 = Math.random();只被调用一次,因为它在 for 循环之外。

标签: java random int


【解决方案1】:

你可以试试这个,它会给你一次输出,输出会随着时间的变化而变化。

class Startup {

    public static void main(String[] args) {
        double match = Math.random();


            if(match < 0.05){
                System.out.println("a");
            }
            else if(0.05 <= match && match <= 0.1){
                System.out.println("b");
            }
            else if(0.1 < match && match <= 0.15){
                System.out.println("c");
            }
            else if(0.15 < match && match <= 0.2){
                System.out.println("d");
            }
            else if(0.2 < match && match <= 0.25){
                System.out.println("e");
            }
            else if(0.25 < match && match <= 0.3){
                System.out.println("f");
            }
            else if(0.3 < match && match <= 0.35){
                System.out.println("g");
            }
            else if(0.35 < match && match <= 0.4){
                System.out.println("h");
            }
            else if(0.35 < match && match <= 0.4){
                System.out.println("i");
            }
            else if(0.4 < match && match <= 0.45){
                System.out.println("j");
            }
            else if(0.45 < match && match <= 0.5){
                System.out.println("k");
            }
            else if(0.5 < match && match <= 0.55){
                System.out.println("l");
            }
            else if(0.55 < match && match <= 0.6){
                System.out.println("m");
            }
            else if(0.6 < match && match <= 0.65){
                System.out.println("n");
            }
            else if(0.65 < match && match <= 0.7){
                System.out.println("o");
            }
            else if(0.7 < match && match <= 0.75){
                System.out.println("p");
            }
            else if(0.75 < match && match <= 0.8){
                System.out.println("q");
            }
            else if(0.8 < match && match <= 0.85){
                System.out.println("r");
            }
            else if(0.85 < match && match <= 0.9){
                System.out.println("s");
            }
            else if(0.9 < match && match <= 0.95){
                System.out.println("t");
            }
            else if(0.95 < match && match <= 1){
                System.out.println("u");
            }

    }
}

【讨论】:

    【解决方案2】:

    正如 cmets 中所指出的,您获得一次随机值,然后在循环内读取相同的值 20 次。显然价值不会那样改变。

    在每次循环迭代中读取不同随机值的明显解决方法是将 match 声明和赋值 移动到循环体中。

    public class Startup {
        public static void main(String[] args) {
            for(int i = 0; i <= 20; i++){
                double match = Math.random(); // moved INSIDE loop
    
                if(match < 0.05){
                    System.out.println("a");
                }
                else if(0.05 <= match && match <= 0.1){
                    System.out.println("b");
                }
                // rest of the conditions here
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用嵌套的for 循环非常简单。无需使用更多 if-else 语句浪费时间和精力。参考以下代码。

      public class Startup {
      
          public static void main(String[] args) {
              double random;
              char[] chars = "abcdefghijklmnopqrstu".toCharArray();
      
              for (int j = 0; j < 20; j++) {
                  random = Math.random();
                  for (int i = 0; i <= 20; i++) {
                      if (random >= i * 0.05 && random < (i + 1) * 0.05) {
                          System.out.println(chars[i]);
                          break;
                      }
                  }
              }
          }
      }
      

      更新:代码被修改为获得 20 个随机数。上一版只有一个随机数和一个输出。当需要 20 个不同的输出时,我不清楚问题。

      【讨论】:

      • 这段代码有问题吗?我经过了很好的测试,并且运行良好。
      【解决方案4】:

      使用这个部分:int random = min + (int)(Math.random() * ((max - min) + 1)

      public class Test
      {
      
          public static void main(String []args){
          int min = 0;
          int max = 1;
      
          for(int i = 0; i < 3; i++)
              System.out.println(min + (int)(Math.random() * ((max - min) + 1)));
           }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多