【问题标题】:Explain what this code is doing解释这段代码在做什么
【发布时间】:2014-07-22 10:52:40
【问题描述】:

我是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)]);
        }
...

【问题讨论】:

  • 哪一点你不明白?
  • 我投给了(++freq[1 + rand.nextInt(6)]);,它看起来非常神秘。
  • 我不明白为什么这个问题被否决了。
  • 因为这个问题在我编辑它之前并不明显,当它清晰可见时,是的,这确实是一个完全有效的问题,因为那行真的是 wtf。
  • (++freq[1 + rand.nextInt(6)]);我不得不承认看起来很邪恶。基本上,它只是从第二个位置(1 + ..)开始增加一个数组的随机值。

标签: java


【解决方案1】:

一行一行:

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

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

for(int roll = 1; roll &lt; 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),每次它“滚动”一个特定数字时,它都会增加存储在该特定位置的数组中的数字。

所以最后,如果你说:

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

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

【讨论】:

  • 我认为在 OP 向我们展示的内容之后实际上还有更多代码,否则他/她最后会有更多 } 字符。我猜测未公开的部分是以某种形式打印出数组中的值的循环。
  • 考虑到这个“教程代码”的质量,我感觉它只是说System.out.println("" + freq[i]);,解释几乎为零。
  • 你可能是对的。顺便说一句,正如您在 cmets 中所暗示的那样,可能值得编辑您的答案以提及该数组实际上已初始化为零。
  • @DavidWallace 基于 google 搜索,我发现 pastebin sn-ps 和 toppersarena.com/index.php/forum/… 老实说我不想从这里学习 Java
【解决方案2】:
(++freq[1 + rand.nextInt(6)]);   // this line of code.

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

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

因此,您的代码将简化为 (++freq[1 + rand.nextInt(6)]) OR `(++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,你可能认为没有' t 差异,但有。

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

【讨论】:

  • 我觉得谈论“这段代码的输出”是没有道理的。代码 sn-p 中没有显示输出。 ++ 运算符的返回值根本没有被使用。另外,如果我不知道什么是“预递增”(坦率地说,我什至不确定是否有这样的词),这对我来说没有多大意义。
  • @DavidWallace-我在我的回答中已经提到,我只是在谈论这段特定的代码,而不是整个代码。其次,任何来自表达式的结果都可以被视为输出。如果你反驳,请解释我错在哪里!另外,我会比以往任何时候都乐意修改它!
  • 我已经解释过了。当 OP 已经表示他们不知道 ++ 做什么时,谈论“预递增”是没有帮助的。谈论“这段代码的输出”是错误的;因为代码实际上没有任何输出。它所做的关键是修改数组中的值 - 但这是你莫名其妙地根本没有提到的东西。
  • @DavidWallace-抱歉再次提到 SIR,但是,我在之前的评论中已经提到,任何来自表达式的结果都可以被视为输出。另外,我有点同意你与++相关的第一部分。但是,我不相信他可能不知道。在建议编码之前的任何书/教程肯定会告诉他++。另外,你是不正确,因为您可以看到对ug_ 的回答的第一条评论。您只在下方评论澄清,而我是支持您的评论的人,在下方留下我的评论。我希望您同意,或者,否则,恐怕我'也必须包括在内。
  • @DavidWallace-另外,我的答案的最后一行清楚地提到了输出为1 more than 6th element of array freq[],如果你可以再检查一次!但是,先生,请发表评论让我感到舒服!
【解决方案3】:
// 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] 永远不会被使用。

【讨论】:

  • 这是否意味着前。 ++频率[5] = =频率[6]
  • 不,它没有。 freq[5] 是被递增的东西。当然,它可以是freq[1], freq[2] ... freq[6] 中的任何一个,具体取决于生成的随机值。
  • @user3864263-检查我的答案。我已经用一个例子演示了!
  • 将“++ ...”理解为“增加在...处的值”。所以每次循环时,你只增加数组中的一个值。
【解决方案4】:

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

您的代码永远不会选择 Array 中索引为 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;
}

此代码尚未经过测试,但基本上应该是一样的。

【讨论】:

  • 上述代码尝试模拟掷骰子,因此他们存储的数字是 1...6 而不是 0...5。
  • @Zhuinden 是的,你可能是对的。但对我来说,在数组中有一个永远不会被使用的第 7 个元素感觉很不对。
  • 我并不惊讶,我也有同感:)
猜你喜欢
  • 2011-03-12
  • 2018-04-26
  • 2015-07-08
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多