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

Java 使用Math.random使用[-n,n]范围内的随机数填充数组,java,arrays,random,Java,Arrays,Random,我有一个函数,在其中输入多维数组n的大小。接下来,我使用Math.random()用[-n,n]范围内的随机数填充这个数组: private int[]enterMatrixSize(){ 系统输出打印(“输入矩阵大小(n):”; 字符串输入; 而(!(input=in.next()).matches(\\p{Digit}+)){ System.out.print(“请输入一个正整数:”); } int size=Integer.parseInt(输入); int[][]数组=新的int[siz

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

private int[]enterMatrixSize(){
系统输出打印(“输入矩阵大小(n):”;
字符串输入;
而(!(input=in.next()).matches(\\p{Digit}+)){
System.out.print(“请输入一个正整数:”);
}
int size=Integer.parseInt(输入);
int[][]数组=新的int[size][size];
for(int i=0;i

但它显示了一些不正确的值。例如,当我输入n等于1时-显示数字0、1和2。这很奇怪。既然应该输出-1,0,1,因为1.5的轮数是2,换句话说,假设random()=1,size=1,那么就有1*(1+1))-1/2so(2-1)/2

相反,可以使用.floor(x)方法,也可以不使用round,因为可以将强制转换为int,这也应该有效(正如@Lino指出的)

将1.5四舍五入的结果汇总为2,
使用floor,你将得到1。

因为1.5的轮数是2,换句话说,假设random()=1,size=1,那么你得到1*(1+1))-1/2 so(2-1)/2

相反,可以使用.floor(x)方法,也可以不使用round,因为可以将强制转换为int,这也应该有效(正如@Lino指出的)

将1.5四舍五入的结果汇总为2,
使用floor,这样您将有1个。

我将更改此行:

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


要在特定范围内生成随机int值,这里[-size,size]

我将更改此行:

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


要在特定范围内生成随机int值,这里[-size,size]

我建议使用
ThreadLocalRandom
,它提供了一种简便的方法:。然后可以在循环中使用,如下所示:

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);
    }
}
int[][]数组=新的int[size][size];
ThreadLocalRandom r=ThreadLocalRandom.current();
for(int i=0;i

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

我建议使用
ThreadLocalRandom
,它提供了一种简便的方法:。然后可以在循环中使用,如下所示:

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);
    }
}
int[][]数组=新的int[size][size];
ThreadLocalRandom r=ThreadLocalRandom.current();
for(int i=0;i

第一个参数
origin
定义数字的起始位置,第二个参数
bound
将生成的数字唯一地限制为给定值。

仅用
size
替换
size+1
,否则将随机数上移
1
,这就是为什么会得到当前输出,因为1.5的整数是2,换句话说,假设random()=1,size=1,那么就得到了1*(1+1))-1/2,所以(2-1)/2,而使用.floor(x)method@vmrvictor然后可以完全省略
Math.floor()
,对
int
的转换将已经丢弃所有小数点,其作用与地板相同operation@Lino不适用于负数
Math.floor(-1.5)==-2
,而
(int)(-1.5)==-1
@DodgyCodeException你完全正确,我的评论甚至说:。。。将放弃所有小数位…,因此必须使用负数
Math.floor()
。如果你已经可以使用jdk来处理
ThreadLocalRandom(int,int)
:)那么为什么要想出这样的逻辑呢?用
size
替换
size+1
,否则你就把随机数向上移动
1
,这就是为什么你会得到当前的输出,因为1.5的整数是2,换句话说,假设随机()=1,size=1,那么就有1*(1+1))-1/2所以(2-1)/2,而使用.floor(x)method@vmrvictor然后可以完全省略
Math.floor()
,对
int
的转换将丢弃所有小数位,其作用与地板相同operation@Lino不适用于负数
Math.floor(-1.5)==-2
,而
(int)(-1.5)==-1
@DodgyCodeException你完全正确,我的评论甚至说:。。。将放弃所有小数位…,因此必须使用负数
Math.floor()
。虽然如果你已经可以使用jdk来处理
ThreadLocalRandom#nextInt(int,int)
:)嗯,我们也有同样的想法,但是你比我们快了几秒钟,那就投票吧;)嗯,我们也有同样的想法,但你比我快了几秒钟,那就投赞成票吧;)由于添加了一些解释,已对您的答案进行了投票;)由于添加了一些解释,已对您的答案进行了投票;)
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);
    }
}