ArrayList包含

gen*_*nfy 1 java random

我真的不明白发生了什么,如果有人可以向我解释这将是伟大的.

所以,这是我的代码:

public static ArrayList<Integer> numbers = new ArrayList<Integer>();

public static void main(String[] args){
    for(int i =0; i != 90; i++){
        System.out.println(generate());
    }
}

public static int generate(){
    Random random = new Random();
    int rand = random.nextInt(89)+1;

    while(numbers.contains(rand)){ //<---Here seems to be my problem
        rand = random.nextInt(89)+1;
        System.out.println("Number: " + rand + " already exists!");
    }
    numbers.add(rand);
    return rand;
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一个程序,它生成一个0-90的随机数,每个都与上一个不同.不幸的是,似乎while循环只返回true.

Jon*_*eet 10

你从89个随机数字(1-89包括在内)中挑选,并且每次都试图找到一个唯一的数字......但是你要打90次.你期望最后一次迭代做什么?(换句话说 - 你试图将90个数字压缩到89个插槽中.这不会起作用.)在最后一次迭代中,所有可能的值都已经在列表中,因此while循环的条件总是如此无论在每次迭代中随机选择什么值,都要满足.

如果您希望数字介于1和90之间,则应该使用random.nextInt(90) + 1.参数to nextInt是生成的唯一最大数量- 因此,如果您调用random.nextInt(3)它,它将生成0,1或2.

(顺便说一下,有更好的方法可以做到这一点 - 例如填充列表然后使用Collections.shuffle- 但我专注于解释当前代码的行为.)

  • @genfy:这就是"我真的不明白发生了什么,如果有人可以向我解释那将会很棒"的问题的答案 - 不像你接受的答案,这提供了另一种方法,但没有解释你的目前的代码.如果你不想知道发生了什么,你想知道什么*做了什么,以及有什么人意识到这一点?我可能没有回答你想问的问题 - 但我回答了你*问过的问题. (2认同)