【问题标题】:math.random, only generating a 0?math.random,只生成一个 0?
【发布时间】:2013-10-03 14:49:57
【问题描述】:

以下代码只产生一个 0 ;-;

我做错了什么?

public class RockPaperSci {

  public static void main(String[] args) {
    //Rock 1
    //Paper 2
    //Scissors 3
    int croll =1+(int)Math.random()*3-1;
    System.out.println(croll);
  }
}

编辑,另一张海报提出了一些修复它的建议。 int croll = 1 + (int) (Math.random() * 4 - 1);

谢谢大家!

【问题讨论】:

标签: java


【解决方案1】:

您正在使用Math.random() 说明

返回一个带正号的double 值,大于或 等于0.0 且小于1.0

您将结果转换为int,它返回值的整数部分,即0

然后1 + 0 - 1 = 0

考虑使用java.util.Random

Random rand = new Random();
System.out.println(rand.nextInt(3) + 1);

【讨论】:

    【解决方案2】:

    Math.random() 在范围 - [0.0, 1.0) 之间生成双精度值。然后您将结果类型转换为int

    (int)Math.random()   // this will always be `0`
    

    然后乘以3 就是0。所以,你的表达真的是:

    1 + 0 - 1
    

    我猜你想这样放括号:

    1 + (int)(Math.random() * 3)
    

    话虽如此,如果你想在某个范围内生成整数值,你真的应该使用Random#nextInt(int) 方法。它比使用Math#random() 更有效。

    你可以这样使用它:

    Random rand = new Random();
    int croll = 1 + rand.nextInt(3);
    

    另请参阅:

    【讨论】:

    • 我认为你的意思是 1 + (int)(Math.random() * 3)
    • @SpiderPig 取决于。目前还不清楚 OP 想要生成什么数字。但我会让他自己决定。谢谢:)
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 我只是这样放括号。在这种情况下,输出并不总是 0。
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 没有问题 :)
    【解决方案3】:

    我们所有的伙伴都向你解释了你得到意外输出的原因。

    假设你想生成一个随机的croll

    考虑Random 的分辨率

        Random rand= new Random();
        double croll = 1 + rand.nextInt() * 3 - 1;
        System.out.println(croll);
    

    【讨论】:

      【解决方案4】:
      public static double random()
      

      返回一个带正号的双精度值,大于或等于 0.0 且小于 1.0。返回值是从该范围内以(近似)均匀分布伪随机选择的。

       int croll =1+(int)Math.random()*3-1;
      

      例如

       int croll =1+0*-1; 
      
      
      System.out.println(croll); // will print always 0 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多