在 Java 中生成一个随机的、固定长度的 BigInteger

问题描述

我正在尝试用 Java 生成一个随机的 20 位 BigInteger

到目前为止,我已经能够生成一个固定长度的十六进制值。

    // generate a user-specified number of random bytes
    public void getRandomNumber(int count) {

        byte[] bytes = new byte[count];
        new SecureRandom().nextBytes(bytes);
        String random = new String(Hex.encode(bytes));
        System.out.println(random);
    }

这是固定长度十六进制生成的理想选择。但是我很难找到一种有效的方法来实现十进制表示;从十六进制转换为 BigInteger(hexValue,16) 时,长度会有所不同。

我曾考虑通过设置上限和下限来尝试这个,或者通过生成足够大的东西并修剪到所需的长度,但这些方法感觉不太干净。

编辑:我想出的解决方案在我的程序中运行良好:

// generate a random number with specified bit length
    public void getTokenID() {
        int count = 64;
        SecureRandom rnd = new SecureRandom();
        BigInteger randomCountLength;
        String token;

        do {
            randomCountLength = new BigInteger(count,rnd);
            token = randomCountLength.toString();
        } while (token.length() != 20);

        Tid = token;
    }

解决方法

我了解到您的问题是生成固定长度(固定位数)的随机数

很明显,使用十六进制值是可行的,因为任何十六进制数字都代表 4 个字节。因此,当您修复字节长度(代码中的字节表)时,它可以正常工作

我在处理十进制数时的建议是:

1- 有一些方法可以生成具有下限和上限的随机数,例如 Random betwen 5 和 10,所以如果你想要一个 20 位的随机数,你必须在 (10^19 ) 和 (10^20-1)

2- 第二种是硬编码方法,当您生成随机数字(0 到 9 之间,强权重的数字必须在 1 到 9 之间)时,进行 20 次迭代的循环并获得数字。>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...