2016-05-13 63 views
6

今天我遇到了这个问题,我确信有一个优雅的解决方案,我没有想到。生成一个具有指定位数的随机整数Java

比方说,我想用一个指定的位数生成一个Java中的随机整数(或长整数),这个位数可以改变。

I.e.将一些数字传入一个方法,并返回一个具有指定位数的随机数。例如,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); 

} 

是否有比这更好/更高效的解决方案?

*在指定范围内生成随机数有很多解决方案,我更加好奇在给定一定数量的数字的情况下生成随机数的最佳方法,以及使解决方案足够健壮以处理任意数量数字。

我不希望有一个最大和最小传递,而只是位数需要

+2

我喜欢你的方法,因为它没有受到LONG长度的约束,除了你长时间施展它。 – Elye

+0

@aetheria更新,以显示它为什么不是重复 –

+0

@aetheria你能解释为什么这是一个重复?这是一个完全不同的问题,比你引用 –

回答

8
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不幸的是没有得到那些不错的新功能。但基本上没有理由继续使用它。

+0

啊。我错过了这个方法,虽然它使用了相同的边界检查思路:while(r = bound)' –

+0

我不知道ThreadLocalRandom。你是否建议一般使用这种随机数生成? –

+0

@TonyScialo是的。 http://stackoverflow.com/questions/23396033/random-over-threadlocalrandom(这是除非你需要安全的随机) – zapl

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); 
    } 
} 
+0

'int x = loIn + r.nextInt(hiEx-loIn)'会更好。 – andrucz

+0

这是为什么?我尝试了一百万次迭代,我的PRNG似乎倾向于平均值。也许我应该尝试更多... –

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); 
} 
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; 
}