ユーザーに乱数、特にランダムな Big Integer の桁数を選択させることは可能ですか? たとえば、ユーザーが 15 桁の長さにしたい場合、乱数ジェネレーターは 15 桁の長さの Big Integer のみを生成します。
4 に答える
BigInteger
2 進数の桁数を指定する場所のコンストラクターを使用できます: BigInteger(int numBits, Random rnd)
。ユーザーが必要とする 3 桁の 10 進数ごとに、およそ 10 桁の 2 進数が必要です。たとえば、30 桁の乱数が必要な場合は、BigInt
100 桁の 2 進数を使用します。
を使用して不要な桁を切り捨て、remainder(10^30)
次のように、最初の桁がゼロではないことを確認してループで実行し、正しい桁数を確保できます。
Random rnd = new Random(123);
BigInteger tenPow30 = new BigInteger("10").pow(30);
BigInteger min = new BigInteger("10").pow(29);
BigInteger r;
do {
r = new BigInteger(100, rnd).remainder(tenPow30);
} while (r.compareTo(min) < 0);
System.out.println(r);
デモへのリンク。
数字の個々の桁をいつでもランダムに生成できます。このようにして、15 桁の数字の場合、15 桁をランダムに生成してから数字を形成できます。
別の方法:
問題を変更して、ランダムな 5 桁の数字を生成してみましょう。
Min = 10000
Max = 99999
0
と の間に乱数を生成し、Max - Min
に0
追加89999
しMin
ます。
Random = Min + Math.random() * (Max - Min)
手順は次のとおりです。
- n 個の数を生成する
- を使用してそれらを組み合わせる
StringBuilder
- を使用して番号を作成します
BigInteger(String)
ここにいくつかのコードがあります:
public static BigInteger randomBigInt(int digits, Random rand) {
StringBuilder sb = new StringBuilder(digits);
// First digit can't be 0
sb.append(rand.nextInt(9) + 1);
int limit = digits - 1;
for (int i = 0; i < limit; i++)
sb.append(rand.nextInt(10));
return new BigInteger(sb.toString());
}
これにより、各桁が個別に生成され、それらが(バッファー オーバーフローの問題を引き起こす可能性のある や何かとStringBuilder
は対照的に) に追加され、その結果を使用して が作成されます。また、最初の桁が 0 になることはありません。int
String
BigInteger
ここの RandomUtil クラスのような Random Generator を使用すると、いくつかの値の間などで乱数を作成できます。
たとえば、このコードを使用すると、min=100000000000000 max=999999999999999 の範囲で 15 桁になります。
BigInteger number = RandomUtil.getRandomBigInteger(new BigInteger("100000000000000"), new BigInteger("999999999999999"), false);