2010-09-14 69 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); 
} 

還有一點要注意的是,它沒有很好的測試代碼。