BigInteger クラスを使用して Java でランダムな n 桁の整数を生成する方法がわかりません。
6 に答える
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))
ドキュメントによると、Java 6 で必要なことを行うコンストラクターがあります: BigInteger(int, java.util.Random)
これには、ランダムに選択された 5000 番目の数字を追加するだけで済みます。つまり、rng コンストラクターを使用して 4999 桁にし、別のランダム プロセスを介して最後の数字を追加します。実際には、大きな値のパフォーマンスをサンプリングしたいだけなので、ビットを生成し、10 進表記に従うのではなく、大きい方の端に 1 ビットを追加することができます。
最も簡単な方法は、おそらく 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)
。
ここに2つのバージョンがあります。1つはパラメーターとしてランダムを取ります(再利用したい場合):
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は、常に指定された長さになります。
n が 1 から 12 の場合、次の方法が役立ちます
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);
}
もう 1 つ注意すべき点は、十分にテストされたコードではないということです。
5000 桁の文字列を取得して、BigInteger に変換します。