解释这段代码在做什么

时间:2014-07-22 10:52:41

标签: java

我是java的新手。我正在阅读一些教程并遇到这些代码我无法理解代码。请解释它的含义。

class Randoms
{
    public static void main(String[] args)
    {
        Random rand = new Random();
        int freq[] = new int[7];
        for(int roll = 1; roll < 10; roll++)
        {            
             (++freq[1 + rand.nextInt(6)]);
        }
...

4 个答案:

答案 0 :(得分:4)

逐行:

Random rand = new Random();创建Random对象的新实例,负责创建随机数。

int[] freq = new int[7];创建一个新的int数组,可以存储7个元素,索引从0到6。值得注意的是,在Java中,存储在数组中的整数被初始化为0。 (对于所有语言都不是这样,例如C,如C int数组最初存储内存垃圾数据,并且必须显式初始化为零)。

for(int roll = 1; roll < 10; roll++)这次翻了9次(因为1 ... 9,但从0开始是更好的做法)

(++freq[1 + rand.nextInt(6)]);这条线是你不应该以这种方式做的事情,因为它是你所看到的怪物。

做这样的事情:

    for(int roll = 0; roll < 9; roll++)
    {            
         int randomNumber = rand.nextInt(6); //number between 0...5
         int index = 1 + randomNumber; //number between 1...6
         freq[index]++; //increment the number specified by the index by 1
                        //nearly equivalent to freq[index] += 1;
    }

所以基本上它随机化9个骰子投掷的数量,并在数组中存储骰子投掷计数(或者它称之为频率)。

因此,它模拟9个骰子投掷(数字从1 ... 6),每次它&#34;滚动&#34;一个特定的数字,它增加了在该特定位置的数组中存储的数字。

所以最后,如果你说:

    for(int i = 1; i <= 6; i++)
    {
        System.out.println("Thrown " + freq[i] + " times of number " + i);
    }

然后会清楚地看到发生了什么。

答案 1 :(得分:1)

(++freq[1 + rand.nextInt(6)]);   // this line of code.

上面的代码行是在指定的位置预先递增freq []数组的值,即1+rand.nextInt(6) ---引用的值是++ freq [某个要评估的位置]我们将在下面评估。

这个rand.nextInt(6)将生成一个小于6且大于0的整数,因为它是Random Class的预定义方法,是随机的。我们无法预测它。 然后,说生成的数字是4. SO,1 + rand.nextInt(6)= 5.

因此,您的代码将简化为(++freq[1 + rand.nextInt(6)])或`(++ freq [5])。

因此,此代码的简化将等同于等于1 more than 6th element of array freq[]的数字。

  // as freq[5] is the 6th element of the array freq[].

此外, SIR David Wallace 还有其他一些建议我要包括哪些内容,我想再解释一下。它如下: -

  1. ++a这里++被称为预增量运算符,它将a的值增加1.还存在一个改变的反向版本。

  2. a++此处++被称为后增量运算符,它还会将a的值增加1.但是, WAIT ,您可能已经想到了没有差异,但有。

  3. 对于差异药水,我想建议阅读What is the difference between pre-increment and post-increment in the cycle (for/while)?,虽然它在C ++方面受到质疑,但同样在Java中也是如此!

答案 2 :(得分:1)

// Create a new Random Object, this helps you generate random numbers
Random rand = new Random();
// create a integer array with 7 integers
int freq[] = new int[7];
// loop 9 times
for(int roll = 1; roll < 10; roll++)
{
    // rand.nextInt(6) generates a number between 0 and 5 (<6). add one to it
    // ++ adds one to the integer in the array that is at the index of 1-6.
    (++freq[1 + rand.nextInt(6)]);
}

关于此代码的一些奇怪的事情:

  • 滚动循环从1开始然后变为10,所以乍一看它似乎循环10次但实际上运行了9次。
  • 循环中的++通常位于右侧,可能会导致新程序员之间的混淆。
  • freq[1 + rand.nextInt(6)]导致永远不会使用freq[0]

答案 3 :(得分:1)

首先创建一个Random-Class的新对象和一个包含7个元素的数组。数组的每个元素的值都为0.在for循环中,你随机选择数组的第2到第7个元素并将其当前值增加1.这样做了9次。

您的代码永远不会选择索引为0的数组的第一个元素。

我会重写代码以使其更清晰:

Random rand = new Random();
int freq[] = new int[6];
int randomIndex = 0;
for(int roll = 0; roll < 9; ++roll)
{
    randomIndex = rand.nextInt(6);
    freq[randomIndex] = freq[randomIndex] + 1;
}

此代码尚未经过测试,但基本上应该这样做。