Java 使用Math.random使用[-n,n]范围内的随机数填充数组
我有一个函数,在其中输入多维数组n的大小。接下来,我使用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
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);
}
}