我的 Java 数组中的增量
The increment in my Java array
有人可以解释一下我下面给出的程序中 ++freq
的作用吗?
package array;
import java.util.Random;
public class CounterArray {
public static void main(String[] args){
Random Ran = new Random();
int freq[] = new int [7];
for(int roll=1;roll<100;roll++){
++freq[1+Ran.nextInt(6)];
}
System.out.println("face\tFrequency");
for(int face=1;face<freq.length;face++){
System.out.println(face+"\t"+freq[face]);
}
}
}
它是增量运算符,其行为如下所示:
int temp = 1+Ran.nextInt(6);
freq[temp] = freq[temp] + 1;
部分Ran.nextInt(6)
会生成一个0到5之间的数字。所以1+Ran.nextInt(6)
会return一个1到6之间的数字。代码将使用这个数字作为索引查找哪个元素应增加 1 的数组。
它只是将1+Ran.nextInt(6)
得到的数组所在位置的值加1。更 "descriptive" 的方式,你可以将其解释为模拟你获得的骰子面是 1+Ran.nextInt(6)
,因此,该面的频率增加一个。
它将数组freq
中的一个随机元素加一。
++freq[1+Ran.nextInt(6)];
Ran.nextInt(6)
部分取一个0到5之间的随机整数,1+部分给随机数加一。因此,如果随机数是 3,则实际上您有 ++freq[4]
(加法后)。由于 freq[4]
只是一个整数引用,您可以递增它。通过使用前缀 ++
,您表示 "add one to whatever number comes after me, and set/return it".
所以你正在做的是在数组中找到一个随机元素并将其递增 1。
该程序所做的是“掷骰子”99 次(闻起来像“差一个”的错误)并计算每个数字被找到的频率。数组 freq
保存在 i
位置 i
被切丁的频率。
相关代码生成下一个随机数,然后递增数组中的相应槽。
++freq[1 + Ran.nextInt(6)];
拆开看会更清楚
- 首先,计算
Ran.nextInt(6)
,从集合 {0, 1, 2, 3, 4, 5} 中产生一个随机整数。为此,将 1 添加到集合 {1, 2, 3, 4, 5, 6} 中得到一个数字。为了清楚起见,让我们将这个中间结果存储在一个单独的变量中:int result = Ran.nextInt(6) + 1
.
- 接下来,在数组中查找相应的频率并加一。
++freq[result]
与 freq[result] += 1
. 效果相同
数组的长度 freq
被设为 7,因此可以使用“自然”索引。即元素freq[0]
被浪费了。 (我怀疑这是不是很好的风格。)
关于风格的另一种说法:通常接受的做法是为类型保留大写名称而不将它们用于变量,因此 Ran
应该真正命名为 ran
以避免混淆。
进一步补充:post自增运算符与i++
中的预自增运算符[=]之间的区别 和 ++i
一样,前一个表达式的结果是 i
在 增量之前的值,而后者的结果是值 在增量之后。就您而言,这没有什么区别,因为您无论如何都没有使用结果。要查看这是如何工作的,请尝试 运行 以下代码:
int i = 10;
System.out.printf("i = %d%n", i);
System.out.printf("i++ = %d%n", i++);
System.out.printf("i = %d%n", i);
System.out.printf("++i = %d%n", ++i);
System.out.printf("i = %d%n", i);
您需要了解一些使用的元素:
++
运算符递增前面或后面的变量。
- 方法
Random.nextInt(int)
returns一个整数。
- 您在此行有多项操作:
++freq[1+Ran.nextInt(6)]
.
这是怎么回事:
Random.nextInt(6)
returns 0 到 5 之间的任意整数,比如 4。
- 使用此代码段:
1 + Ran.nextInt(6)
,您将 4 加 1,得到 5。
- 因此您正在调用
freq
整数数组的索引 5。
- 由于你只初始化了数组的大小,并没有设置任何值,所有值默认为
0
a.
freq[5]
returns 0,因为freq
数组第5位的值为0
a.
如果我们重写代码片段 ++freq[1+Ran.nextInt(6)]
,它将如下所示:
int diceResult = Ran.nextInt(6); // Returns, say, 4
int index = 1 + diceResult; // We increment dice result by 1
freq[5] = freq[5] + 1;
a当然,当循环重复时,这些值可能会大于0。
有人可以解释一下我下面给出的程序中 ++freq
的作用吗?
package array;
import java.util.Random;
public class CounterArray {
public static void main(String[] args){
Random Ran = new Random();
int freq[] = new int [7];
for(int roll=1;roll<100;roll++){
++freq[1+Ran.nextInt(6)];
}
System.out.println("face\tFrequency");
for(int face=1;face<freq.length;face++){
System.out.println(face+"\t"+freq[face]);
}
}
}
它是增量运算符,其行为如下所示:
int temp = 1+Ran.nextInt(6);
freq[temp] = freq[temp] + 1;
部分Ran.nextInt(6)
会生成一个0到5之间的数字。所以1+Ran.nextInt(6)
会return一个1到6之间的数字。代码将使用这个数字作为索引查找哪个元素应增加 1 的数组。
它只是将1+Ran.nextInt(6)
得到的数组所在位置的值加1。更 "descriptive" 的方式,你可以将其解释为模拟你获得的骰子面是 1+Ran.nextInt(6)
,因此,该面的频率增加一个。
它将数组freq
中的一个随机元素加一。
++freq[1+Ran.nextInt(6)];
Ran.nextInt(6)
部分取一个0到5之间的随机整数,1+部分给随机数加一。因此,如果随机数是 3,则实际上您有 ++freq[4]
(加法后)。由于 freq[4]
只是一个整数引用,您可以递增它。通过使用前缀 ++
,您表示 "add one to whatever number comes after me, and set/return it".
所以你正在做的是在数组中找到一个随机元素并将其递增 1。
该程序所做的是“掷骰子”99 次(闻起来像“差一个”的错误)并计算每个数字被找到的频率。数组 freq
保存在 i
位置 i
被切丁的频率。
相关代码生成下一个随机数,然后递增数组中的相应槽。
++freq[1 + Ran.nextInt(6)];
拆开看会更清楚
- 首先,计算
Ran.nextInt(6)
,从集合 {0, 1, 2, 3, 4, 5} 中产生一个随机整数。为此,将 1 添加到集合 {1, 2, 3, 4, 5, 6} 中得到一个数字。为了清楚起见,让我们将这个中间结果存储在一个单独的变量中:int result = Ran.nextInt(6) + 1
. - 接下来,在数组中查找相应的频率并加一。
++freq[result]
与freq[result] += 1
. 效果相同
数组的长度 freq
被设为 7,因此可以使用“自然”索引。即元素freq[0]
被浪费了。 (我怀疑这是不是很好的风格。)
关于风格的另一种说法:通常接受的做法是为类型保留大写名称而不将它们用于变量,因此 Ran
应该真正命名为 ran
以避免混淆。
进一步补充:post自增运算符与i++
中的预自增运算符[=]之间的区别 和 ++i
一样,前一个表达式的结果是 i
在 增量之前的值,而后者的结果是值 在增量之后。就您而言,这没有什么区别,因为您无论如何都没有使用结果。要查看这是如何工作的,请尝试 运行 以下代码:
int i = 10;
System.out.printf("i = %d%n", i);
System.out.printf("i++ = %d%n", i++);
System.out.printf("i = %d%n", i);
System.out.printf("++i = %d%n", ++i);
System.out.printf("i = %d%n", i);
您需要了解一些使用的元素:
++
运算符递增前面或后面的变量。- 方法
Random.nextInt(int)
returns一个整数。 - 您在此行有多项操作:
++freq[1+Ran.nextInt(6)]
.
这是怎么回事:
Random.nextInt(6)
returns 0 到 5 之间的任意整数,比如 4。- 使用此代码段:
1 + Ran.nextInt(6)
,您将 4 加 1,得到 5。 - 因此您正在调用
freq
整数数组的索引 5。 - 由于你只初始化了数组的大小,并没有设置任何值,所有值默认为
0
a. freq[5]
returns 0,因为freq
数组第5位的值为0
a.
如果我们重写代码片段 ++freq[1+Ran.nextInt(6)]
,它将如下所示:
int diceResult = Ran.nextInt(6); // Returns, say, 4
int index = 1 + diceResult; // We increment dice result by 1
freq[5] = freq[5] + 1;
a当然,当循环重复时,这些值可能会大于0。