使用数组

时间:2016-07-10 08:54:20

标签: java

我很难理解使用数组的这个roll die JAVA程序中的某些代码行。 该程序记录数字1-6的频率,然后在控制台中显示。

import java.security.SecureRandom;

public class RollDie{

    public static void main(String[] args){
        SecureRandom randomNumbers=new SecureRandom();
        int[] frequency=new int[7]; //array of frequency counter

        //roll die 6000000 times, use die value as frequency index
        for(int i=1; i<=6000000;i++)
            ++frequency[1+randomNumbers.nextInt(6)];
        System.out.printf("%s%10s%n","face","frequency");

        for(int face=1;face<frequency.length;face++)
            System.out.printf("%4d%10d%n", face, frequency[face]);
    }
}

任何人都可以解释这一行:

++frequency[1+randomNumbers.nextInt(6)];

2 个答案:

答案 0 :(得分:0)

我已将其划分为执行顺序,以便更容易理解。评估顺序遵循以下顺序:

  

1. randomNumbers.nextInt(6) 获取0到5之间的随机数
  2. 1 + randomNumbers.nextInt(6) - 添加一个

     
      
  1. 频率[1 + randomNumbers.nextInt(6)] - 从已计算的索引下的频率中提取值。
  2.   
  3. ++ frequency [1 + randomNumbers.nextInt(6)] - *在频率*中为该元素添加1
  4.   

旧频率值与该位置上的新频率值之间的差值为1.

本质上,这个问题与Java中运算符的优先级有关,这里已经详细讨论过了 What are the rules for evaluation order in Java?

答案 1 :(得分:0)

这条线写得很清楚。我花了很长时间才理解它。

首先,我们看到++前缀运算符。你知道它做对了吗?在评估任何其他运算符之前,它会增加左侧的变量。由于没有任何其他运算符,它只会将frequency[1+randomNumbers.nextInt(6)]递增1。

那么frequency[1+randomNumbers.nextInt(6)]这件事是什么?

首先,您会看到它正在访问数组frequency,因为有[]个事物。那么访问哪个索引?好吧,1+randomNumbers.nextInt(6)

nextInt(x)会在0x-1之间返回一个均匀分布的随机数。 nextInt(6)返回0到5之间的随机数。但是典型的骰子掷骰总是会产生1到6!这就是我们需要在nextInt的返回值中加1的原因。因此,指数将介于1 - 6之间。

因此,作为一个整体,整行只是掷骰子(1+randomNumbers.nextInt(6)),并增加数组frequency的相应索引。

如果它是这样编写的,可能会更容易阅读:

int diceRoll = randomNumbers.nextInt(6);
frequency[diceRoll]++;