int[] numbers = new int[n];
            for (int i=0; i<numbers.length; i++)
               numbers[i] = i;
     
            int[] result = new int[k];
            for (int i=0; i<result.length; i++){
               int r = (int)(Math.random() * n);
     
               result[i] = numbers[r];
               numbers[r] = numbers[n-1];
               n--;
               }

哪位高手帮忙解释下,后面的循环中第二个不同的随机数是如何生成的??
实在想不明白,怎么会和第一个随机数肯定不相同~~~

解决方案 »

  1.   

    看看JDK嘛,java.lang包下的!!!
      

  2.   

    Math.random() 会生成一个0-1的随机小数,当它乘上N再取整就会得到一个0-N的整数。就这么简单:)
      

  3.   

    其实random这个我清楚,我是不清楚最后两行代码,我是不太明白生成的result[i]值,怎么一定会不同呢~
      

  4.   

     for (int i=0; i <result.length; i++){ 
                  int r = (int)(Math.random() * n); //生产一个0-1的随机数然后乘以N后复制给r
        
                  result[i] = numbers[r]; // 第一次将numbers[r]赋值给result[0]
                  numbers[r] = numbers[n-1]; //将numbers数组中倒数第二个赋值给numbers[r]
                  n--; //n自减
    不明白LZ问题的意思??什么叫第二个不同的随机数??
       是不是for循环进行到第二轮的时候random函数生成的数???
      

  5.   

    其实你debug一下你会发现
    刚开始时numbers的内容不一样,到后来会有很多值一样,
    他们不相同的前提是k必须小过n
      

  6.   

    对,不同的随机数就是for进行到第二轮时生成的数,
    不好意思,忘了说前提了,前提确实是k<n.
    我昨天已经看懂了,
    numbers[r] = numbers[n-1]; //将numbers数组中最后一个元素赋值给numbers[r]
      

  7.   

    Math.random() 会生成一个0-1的随机小数,当它乘上N再取整就会得到一个0-N的整数。 就这么简单:)
      

  8.   

    Math.random() 会生成一个0-1的随机小数,当它乘上N再取整就会得到一个0-N的整数。 
    如果想得到更随机的数字,可以用(new Random).nextInt(),这个方法更好