我今天遇到了这个问题,我确信有一个我没想到的优雅解决方案.
假设我想在Java中生成一个具有指定位数的随机整数(或长整数),其中这个位数可以改变.
即将多个数字传递给方法,并返回具有指定位数的随机数
例)N = 3,产生100-999之间的随机数; N = 4,生成1000-9999之间的随机数
private long generateRandomNumber(int n){
/*Generate a random number with n number of digits*/
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我的尝试(这有效,但看起来很乱)
private long generateRandomNumber(int n){
String randomNumString = "";
Random r = new Random();
//Generate the first digit from 1-9
randomNumString += (r.nextInt(9) + 1);
//Generate the remaining digits between 0-9
for(int x = 1; x < n; x++){
randomNumString += r.nextInt(9);
}
//Parse and return
return Long.parseLong(randomNumString);
}
Run Code Online (Sandbox Code Playgroud)
有没有比这更好/更有效的解决方案?
*有很多解决方案可以在指定的范围内生成随机数,我对给定一定数量的数字生成随机数的最佳方法更加好奇,并且使解决方案足够强大以处理任意数量的数字.
我不想传递最小值和最大值,而只需要传递所需的位数
zap*_*apl 11
private long generateRandomNumber(int n) {
long min = (long) Math.pow(10, n - 1);
return ThreadLocalRandom.current().nextLong(min, min * 10);
}
Run Code Online (Sandbox Code Playgroud)
nextLong产生下限包含和上限独占之间的随机数,因此用参数调用它,(1_000, 10_000)例如结果数字1000到9999. Random遗憾的是,Old 没有得到那些漂亮的新功能.但无论如何基本上没有理由继续使用它.
public static int randomInt(int digits) {
int minimum = (int) Math.pow(10, digits - 1); // minimum value with 2 digits is 10 (10^1)
int maximum = (int) Math.pow(10, digits) - 1; // maximum value with 2 digits is 99 (10^2 - 1)
Random random = new Random();
return minimum + random.nextInt((maximum - minimum) + 1);
}
Run Code Online (Sandbox Code Playgroud)