我很难理解使用数组的这个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)];
答案 0 :(得分:0)
我已将其划分为执行顺序,以便更容易理解。评估顺序遵循以下顺序:
1. randomNumbers.nextInt(6) 获取0到5之间的随机数
2. 1 + randomNumbers.nextInt(6) - 添加一个
- 频率[1 + randomNumbers.nextInt(6)] - 从已计算的索引下的频率中提取值。
- ++ frequency [1 + randomNumbers.nextInt(6)] - *在频率*中为该元素添加1
醇>
旧频率值与该位置上的新频率值之间的差值为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)
会在0
和x-1
之间返回一个均匀分布的随机数。 nextInt(6)
返回0到5之间的随机数。但是典型的骰子掷骰总是会产生1到6!这就是我们需要在nextInt
的返回值中加1的原因。因此,指数将介于1 - 6之间。
因此,作为一个整体,整行只是掷骰子(1+randomNumbers.nextInt(6)
),并增加数组frequency
的相应索引。
如果它是这样编写的,可能会更容易阅读:
int diceRoll = randomNumbers.nextInt(6);
frequency[diceRoll]++;