生成不重复的随机数

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

我怀疑如果我将我的

index++
留在
ifn
中,就像下面的代码一样,程序不会执行,但是如果我把它放在开头,如果已经生成的数字是,则程序永远不会生成新数字一样的,我真的不知道我的错误在哪里 注意:我是在 Windows Builder 中完成的

    private int[] number = new int[] { -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1};
            private int index;
            private int randomNumber;
            private boolean numberRepeated;

                Random random = new Random();
        index = 0;
        while(index < 10) {
            randomNumber = random.nextInt(9);
            numberRepeated = false;  
            for(int i = 0 ; i < index; i++) {
                if(number[i] == randomNumber) {
                    numberRepeated = true;
                    break;
                }
            }
            if(!numberRepeated) {
                number[index] = randomNumber;
                index++;
            }
            
        }

我已经尝试过更改

index++
,但是当我这样做时,如果已经输入了相同的值,程序不会生成新值。

java windowbuilder
1个回答
0
投票

第一个问题是

Random.nextInt(9)
给出从 0 到 8 的值。

numberRepeated
会发生得越来越多,
index
就越大。甚至不能 100% 保证随机找到最后一位数字。

private int[] number = new int[10];


    Random random = new Random();
    for (int index = 0; index < 10; ++index) {
        randomNumber = random.nextInt(10); // 0 .. 9
        boolean numberRepeated = false;  
        for (int i = 0 ; i < index; i++) {
            if (number[i] == randomNumber) {
                numberRepeated = true;
                break;
            }
        }
        if (!numberRepeated) {
            number[index] = randomNumber;
            index++;
        }
    }

更好更快

    // Start sorted:
    for (int index = 0; index < 10; ++index) {
        number[index] = index;
    }
    // Randomly swap elements:
    Random random = new Random();
    for (int index = 0; index < 10; ++index) {
        int index2 = randomNumber = random.nextInt(10); // 0 .. 9
        // Swap values at index and index2;
        int temp = number[index];
        number[index] = number[index2];
        number[index2] = temp;
    }

这可以用较新的 java 结构来完成,例如 0 .. 9:

    number = IntStream.range(0, 10).toArray();

或:

    Arrays.setAll(number, IntUnaryOperator::identity);

或者;

    Arrays.setAll(number, i -> i);
© www.soinside.com 2019 - 2024. All rights reserved.