Android中随机数的错误

And*_* me 0 java random math android

TreeSet myNumbers = new TreeSet();
Random randGen = new Random();

for (int i = 1; i <= 16; i++) {
    // number generation here
    int randNum = randGen.nextInt(16 - 1) + 1;
    for (;;) {
        if (myNumbers.add(randNum))
            break;
        else
            randNum = randGen.nextInt();

    }
    Toast.makeText(getApplicationContext(), "" + randNum, 100).show();
}
Run Code Online (Sandbox Code Playgroud)

我想生成1到16之间的随机数,并且不应重复相同的数字.

上面的代码给出了如下输出:

2, 5, 7, 9, 1, 4, 10.4109446, -448831, 98824724, 11, 13, ...
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它给了我不在1-16范围内的随机数,请帮帮我.

Jos*_*h M 6

要生成范围内的随机数,它就像:

int min = ...
int max = ...
int randNumber = min + new Random().nextInt(max - min + 1);
Run Code Online (Sandbox Code Playgroud)

因此,在您想要从[1,16]生成随机数的示例中,它看起来像:

int randNumber = 1 + new Random().nextInt(16 - 1 + 1);
Run Code Online (Sandbox Code Playgroud)

或者,如果您选择简化:

int randNumber = 1 + new Random().nextInt(16);
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用while循环而不是无限for循环:

    final TreeSet<Integer> myNumbers = new TreeSet<>();
    final Random rand = new Random();
    for(int i = 0; i < 16; i++){
        int n = 1 + rand.nextInt(16);
        while(!myNumbers.add(n))
            n = 1 + rand.nextInt(16);
    }
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 6

您只生成1-15范围内的一个数字.然后,您只需使用以下内容生成后续数字nextInt:

if (myNumbers.add(randNum))
    break;
else
    randNum = randGen.nextInt();
Run Code Online (Sandbox Code Playgroud)

那应该是:

if (myNumbers.add(randNum))
    break;
else
    randNum = randGen.nextInt(16) + 1;
Run Code Online (Sandbox Code Playgroud)

...并修复初始调用nextInt以删除"-1".(你不需要16 - 1,正如Josh的回答所解释的那样.)