5

以下代码仅产生 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);

感谢大家!

4

4 回答 4

22

您正在使用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);
于 2013-10-03T14:51:23.187 回答
6

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

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

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

1 + 0 - 1

我猜你想像这样放括号:

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

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

你可以像这样使用它:

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

也可以看看:

于 2013-10-03T14:51:41.063 回答
0
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 
于 2013-10-03T14:53:04.680 回答
0

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

假设你想生成一个随机croll

考虑Random解决

    Random rand= new Random();
    double croll = 1 + rand.nextInt() * 3 - 1;
    System.out.println(croll);
于 2013-10-03T14:55:57.423 回答