【问题标题】:Generate a random, fixed length BigInteger in Java [duplicate]在 Java 中生成一个随机的、固定长度的 BigInteger [重复]
【发布时间】:2021-02-17 13:24:09
【问题描述】:

我正在尝试在 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;
    }

【问题讨论】:

  • 20位是指十进制、十六进制还是二进制?
  • @ArtjomB。对不起,我的意思是十进制数字。我想我已经找到了解决问题的方法——尽管它可能不是最有效的解决方案,但我会将其添加到我的帖子中。
  • @lb-99 最好发布self-answer,而不是在帖子中编辑您的答案。这使事情变得清晰和分开,并让人们与所有其他人一起对答案进行投票——这可能不是最好的解决方案。谢谢。
  • @ggorlen 出于某种原因我无法回答这个问题 - 可能是因为它已被标记为重复?

标签: java random biginteger


【解决方案1】:

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

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

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

1- 有一些方法可以生成具有下限和上限的随机数,例如 5 和 10 之间的随机数,因此如果您想要例如 20 位的随机数,则必须生成 (10^19 之间的随机数) 和 (10^20-1)

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

【讨论】:

    猜你喜欢
    • 2015-09-13
    • 2016-04-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多