我的 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)].

这是怎么回事:

  1. Random.nextInt(6) returns 0 到 5 之间的任意整数,比如 4。
  2. 使用此代码段:1 + Ran.nextInt(6),您将 4 加 1,得到 5。
  3. 因此您正在调用 freq 整数数组的索引 5。
  4. 由于你只初始化了数组的大小,并没有设置任何值,所有值默认为0a.
  5. freq[5] returns 0,因为freq数组第5位的值为0a.

如果我们重写代码片段 ++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。