使用Math.random用[-n,n]范围内的随机数填充数组

时间:2019-02-11 13:45:24

标签: java arrays random

我有一个函数,可以输入多维数组n的大小。接下来,我使用Math.random()在这个数组中填充[-n,n]范围内的随机数:

private int[][] enterMatrixSize() {
    System.out.print("enter matrix size (n): ");
    String input;
    while (!(input = in.next()).matches("\\p{Digit}+")) {
        System.out.print("Please enter a positive Integer: ");
    }
    int size = Integer.parseInt(input);
    int[][] array = new int[size][size];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            array[i][j] = (int) (Math.round(Math.random() * (size + 1)) - size / 2);
        }
    }
    for (int i = 0; i < array.length; i++, System.out.println()) {
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j]+" ");
        }
    }
    return array;
}

但是它显示了一些不正确的值。例如,当我输入等于1的n时-显示数字0、1和2。这很奇怪。由于应该输出-1,0,1

3 个答案:

答案 0 :(得分:2)

我将更改此行:

array[i][j] = (int) (Math.round(Math.random() * (size + 1)) - size / 2); 

收件人:

array[i][j] = ThreadLocalRandom.current().nextInt( -size, size + 1);

生成特定范围内的随机int值,此处为[-size,size]

答案 1 :(得分:2)

我建议使用ThreadLocalRandom,它提供了一种方便的方法:nextInt(int origin, int bound)。然后可以在循环中使用以下代码:

int[][] array = new int[size][size];
ThreadLocalRandom r = ThreadLocalRandom.current();
for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        array[i][j] = r.nextInt(-size, size + 1);
    }
}

第一个参数origin定义了数字应从何处开始,第二个参数bound专门将生成的数字限制为给定值。

答案 2 :(得分:0)

因为1.5的回合是2,所以换句话说,假设random()= 1和size = 1,则您有1 *(1 + 1))-1/2因此(2-1)/ 2

round(1.5)=2

而不是使用.floor(x)方法或不使用round,因为您已经将其强制转换为int,这也应该起作用(如@Lino所指出的那样)。

汇总1.5的舍入结果为2, 使用地板,这样您将拥有1。