这是个抽数游戏的代码,代码来自java核心技术卷一。问题写在代码块里了。拜托大佬帮忙解答下?

package april_11;
import java.util.*;
public class LotteryDrawing
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("How many numbers do you need to draw? ");
int k = in.nextInt();

    System.out.print("What is the highest number you can draw? ");
    int n = in.nextInt();

    int[] numbers = new int [n];
    for(int i = 0; i<numbers.length; i++) 
    {
        numbers[i] = i + 1;
    }

    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--;    
    }

    Arrays.sort(result);

    for(int r : result)
    {
    System.out.println(r);
    }

}

}

numbers[r] = numbers[n - 1],这代码意思就是把你当前数组的最后一个数字赋值到取出来的数字的下标去,n--; 在排除掉数组的最后一个数据

比如:原本数据[10,20,30,40,50],你抽取了20,它就会把20那个位置的改成50,然后数组长度减一,所以可以确保抽过的数不会再抽到