Math.random的可变递减确保非重复性?

问题描述 投票:0回答:1

我知道这可能是一个noobie的问题,但是现在大约30分钟我都无法解决这个问题。我不了解此代码如何设法排除重复Math.random结果的可能性。

此部分:

chosenNumbers[rundom] = chosenNumbers[biggestNumber - 1];
biggestNumber--;

以某种方式确保不会重复任何数字。有人可以告诉我它如何运作吗?是否会为每个循环更改“ biggestNumber”的值?如果是这样,Math.random仍然可以通过乘以最初更大的“ biggestNumber”来绘制一个数字,该数字甚至乘以一个递减的“ biggestNumber”将与之前绘制的数字完全相同。]

    Scanner sc = new Scanner(System.in);


    System.out.println("How many numbers do you need to draw?");
    int numbersToDraw = sc.nextInt();

    System.out.println("What is the biggest number?");
    int biggestNumber = sc.nextInt();

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

    int[] result = new int[numbersToDraw];
    for(int i = 0; i < result.length; i++){
        int rundom = (int) (Math.random() * biggestNumber);
        result[i] = chosenNumbers[rundom];
        chosenNumbers[rundom] = chosenNumbers[biggestNumber - 1];
        biggestNumber--;
    }

    Arrays.sort(result);
    System.out.println("Choose the following numbers to get so really rich.");
    for(int r : result){
        System.out.println(r);
    }

我知道这可能是一个noobie的问题,但是现在大约30分钟我都无法解决这个问题。我不明白这段代码是如何排除重复数学的可能性的。...

java
1个回答
0
投票

代码保留一个可能值的数组-selectedNumbers-并使用随机数作为数组的索引。使用该值后,会将其从列表中删除。即使您再次获得相同的随机数,该点的值现在也将来自该点+1。

© www.soinside.com 2019 - 2024. All rights reserved.