2010-09-14 53 views
15

我不确定如何使用BigInteger类在Java中生成一个随机的n位整数。如何使用BigInteger类在Java中生成一个随机的n位整数?

+0

嗯......最好的办法就是进行构建了完全随机的32位或64位数字。不确定API是否允许。 – 2010-09-14 13:56:29

+0

嗯...我从来没有这样做过,但我相信,海啸提供了比我更好的解决方案。你应该接受他的回答。我想,当你说“5000位数字”时,你的意思是第一个数字不是0,我的答案不符合这个。 – 2010-09-14 21:34:00

回答

11
private static Random rnd = new Random(); 

public static String getRandomNumber(int digCount) { 
    StringBuilder sb = new StringBuilder(digCount); 
    for(int i=0; i < digCount; i++) 
     sb.append((char)('0' + rnd.nextInt(10))); 
    return sb.toString(); 
} 

然后你就可以使用它:

new BigInteger(getRandomNumber(10000)) 
+0

不错,你需要一个特殊情况下的第一个数字,虽然 – 2010-09-14 15:07:09

+0

@seanizer:如果我们想在范围1x..x - 9..9的均匀分布,那么你是对的。我假定在整个范围内均匀分布。 +1无论如何你的答案:) – 2010-09-14 15:27:02

+0

由于某些原因,我有时会得到17而不是18的长度 – 2015-09-22 08:25:43

3

最简单的方法很可能是填写一个char []数组与5000个随机数字,将其转换成一个字符串,然后调用构造函数BigInteger(String)

如果任何这些步骤使您的问题,请提供更多的细节。

或者,你可以做这样的事情:

Random rng = new Random(); // But use one instance throughout your app 
BigInteger current = BigInteger.ZERO; 
for (int i = 0; i < 5000; i++) { 
    BigInteger nextDigit = BigInteger.valueOf(rng.nextInt(10)); 
    current = current.multiply(BigInteger.TEN).add(nextDigit); 
} 

我怀疑这会是相当低效虽然。

你可以减少通过一次产生9个随机数字所需的步骤数,与rng.nextInt(1000000000)

+1

请注意,这会给你1到10^5000之间的随机分布,所以由此产生的一些数字不会是5000个数字长。如果需要5000个数字之间的均匀分布,则应将第一个数字作为rng.nextInt(9)+1选择的特殊情况。 – oksayt 2010-09-14 14:09:21

+1

@oksayt:是的,我几乎提到了......于是决定不要那么挑剔;) – 2010-09-14 14:12:46

+0

INT I; char [] num = new char [5000]; 随机R =新随机(); 为(I = 0; I <5000;我++){ INT J = R.nextInt(10)+ 1; num [i] =(char)j; } String s = num。的toString(); BigInteger n = new BigInteger(s); – makaveli2178 2010-09-14 15:03:42

0

一个字符串在其5000个数字,然后将其转换成的BigInteger。

5

根据该文档,有一个构造函数你在Java 6想要的东西:BigInteger(int, java.util.Random)

这一点,你只需要添加一个随机选择的第5000位,即。使用rng构造函数为4999位数,通过单独的随机过程添加最后一个数字。实际上,由于您只想对大值进行性能抽样,因此您可以生成这些位,并在大端上添加一位,而不是从端添加到十进制符号。

+0

这给出了许多* bits *而不是* digits *,如果OP想要随机分配超过5000个数字的数字,这将使其至少*略微* fiddly ..基本上会生成一个可能太大的随机值,并且然后重复,直到有合理的一个出现。 – 2010-09-14 14:14:08

+0

@Jon:see edit;如果op对于他的问题的“大小”意味着什么是灵活的,那么5000比特(等等)可能与5000个数字一样好。另外,我的手机很难回答问题。 – Carl 2010-09-14 14:20:52

+0

是的,我想让数字不是位。我使用了你提到的那个构造函数,然后才意识到它只给出了一个介于0到2^numbits之间的数字 - 1,而不是5000数字整数 – makaveli2178 2010-09-14 14:29:49

2

这里有两个版本,一个采用随机的参数(如果你想重新使用它):

public static BigInteger getRandomNumber(final int digCount){ 
    return getRandomNumber(digCount, new Random()); 
} 

public static BigInteger getRandomNumber(final int digCount, Random rnd){ 
    final char[] ch = new char[digCount]; 
    for(int i = 0; i < digCount; i++){ 
     ch[i] = 
      (char) ('0' + (i == 0 ? rnd.nextInt(9) + 1 : rnd.nextInt(10))); 
    } 
    return new BigInteger(new String(ch)); 
} 

所得的BigInteger总会有指定的长度。

1

如果n为112之间,然后下面的方法可以帮助

private String getRandom(int length) { 
    if (length < 1 && length > 12) { 
     throw new IllegalArgumentException("Random number generator length should be between 1 to 12"); 
    } 
    long nextLong = Math.abs(random.nextLong()); 
    return String.valueOf(nextLong).substring(0, length); 
} 

还有一点要注意的是,它没有很好的测试代码。

相关问题