我今天遇到了这个问题,我确信有一个我没想到的优雅解决方案。
假设我想在Java中生成一个具有指定位数的随机整数(或长整数),其中这个位数可以改变。
即。将多个数字传递给方法,并返回具有指定位数的随机数
例)N = 3,产生100-999之间的随机数; N = 4,产生1000-9999之间的随机数
private long generateRandomNumber(int n){
/*Generate a random number with n number of digits*/
}
到目前为止我的尝试(这很有效,但看起来很混乱)
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);
}
是否有比这更好/更有效的解决方案?
*有很多解决方案可以在指定范围内生成随机数,我对给定一定数量的数字生成随机数的最佳方法更感兴趣,并且使解决方案足够强大以处理任意数量的数字。
我不想传递最小值和最大值,而只需传递所需的位数
答案 0 :(得分:10)
private long generateRandomNumber(int n) {
long min = (long) Math.pow(10, n - 1);
return ThreadLocalRandom.current().nextLong(min, min * 10);
}
nextLong
生成下限包含和上限独占之间的随机数,因此使用参数(1_000, 10_000)
调用它,例如结果为1000到9999。
遗憾的是,旧Random
没有得到那些不错的新功能。但无论如何基本上没有理由继续使用它。
答案 1 :(得分:3)
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);
}
答案 2 :(得分:2)
您可以简单地忽略不在所需范围内的数字。这样,您修改的伪随机数生成器可以保证它在随机范围内均匀地生成给定范围内的数字:
public class RandomOfDigits {
public static void main(String[] args) {
int nd = Integer.parseInt(args[0]);
int loIn = (int) Math.pow(10, nd-1);
int hiEx = (int) Math.pow(10, nd);
Random r = new Random();
int x;
do {
x = r.nextInt(hiEx);
} while (x < loIn);
System.out.println(x);
}
}
答案 3 :(得分:0)
以下是我自然会编写这样一个方法的方法:
private long generateRandomNumber(int n){
double tenToN = Math.pow(10, n),
tenToNMinus1 = Math.pow(10, n-1);
long randNum = (long) (Math.random() * (tenToN - tenToNMinus1) + tenToNMinus1);
return randNum;
}