当前位置: 首页 > 面试题库 >

如何在Java中创建随机的BigDecimal?

林鸿彩
2023-03-14
问题内容

这个问题:如何生成随机BigInteger描述了一种与BigIntegers实现与Random.nextInt(int n)相同的语义的方法。

我想对BigDecimal和Random.nextDouble()做同样的事情。

上述问题的一个答案建议创建一个随机的BigInteger,然后从中以随机的比例创建一个BigDouble。一个非常快速的实验表明这是一个非常糟糕的主意:)

我的直觉是,使用此方法将需要对整数进行缩放,例如 n-log10(R),其中n是输出中所需精度的位数,R是随机BigInteger。这应该允许显示正确的数字位数,以便(例如)1->
10 ^ -64和10 ^ 64-> 1。

还需要正确选择缩放值,以使结果落在[0,1]范围内。

以前有人做过吗,他们是否知道结果是否正确分发?有没有更好的方法来实现这一目标?

编辑: 感谢@biziclop纠正了我对scale参数的理解。上面的内容不是必需的,恒定的比例因子具有预期的效果。

供以后参考,我的(显然是工作代码)是:

private static BigDecimal newRandomBigDecimal(Random r, int precision) {
    BigInteger n = BigInteger.TEN.pow(precision);
    return new BigDecimal(newRandomBigInteger(n, r), precision);
}

private static BigInteger newRandomBigInteger(BigInteger n, Random rnd) {
    BigInteger r;
    do {
        r = new BigInteger(n.bitLength(), rnd);
    } while (r.compareTo(n) >= 0);

    return r;
}

问题答案:

如果我只知道您想要什么,那肯定很容易。对于范围为[0,1)的均匀分布的数字和精度为N的十进制数字,生成的统一BigInteger小于10 * N,并将其按比例缩小10 * N。



 类似资料:
  • 问题内容: 使用标准JDK在Java中生成安全的随机AES密钥的推荐方法是什么? 在其他帖子中,我发现了这一点,但是使用a 可能是一个更好的主意: 如果答案中包含对为什么这是生成随机密钥的一种好方法的解释,那将是很好的。谢谢! 问题答案: 我将使用您建议的代码,但略作简化: 让提供者选择计划如何获得随机性-不要定义可能不如提供者已经选择的东西更好的东西。 该代码示例假定(如Maarten所指出的那

  • 问题内容: 我正在用python创建一个项目,我想创建一个加密安全的随机数,我该怎么做?我已经在线阅读了常规随机生成器生成的数字不是密码安全的信息,并且该函数返回的是我的字符串,而不是数字。 问题答案: 您可以通过将函数应用于所返回的字节来获取随机数列表,如下所示 报价文件, 返回 适合加密使用* 的随机字节字符串。 * 该函数从特定于操作系统的随机性源返回随机字节。尽管返回的数据的确切质量取决于

  • 本文向大家介绍如何在R中创建具有随机值的矩阵?,包括了如何在R中创建具有随机值的矩阵?的使用技巧和注意事项,需要的朋友参考一下 通常,使用给定值创建矩阵,但是如果我们要创建具有随机值的矩阵,则将对矩阵函数使用常规方法。R中的随机选择可以根据我们的目标以多种方式完成,例如,如果要从正态分布中随机选择值,则将使用rnorm函数并将其存储在矩阵中,然后将其传递到矩阵函数中。 示例 输出结果 示例 输出结

  • 我如何创建一个懒散的随机数序列? 执行它将引发异常: (线程“main”clojure.lang.arityException中的异常:传递给:USER$random-numbers$fn at clojure.lang.afn.throwarity(afn.java:437)at clojure.lang.afn.invoke(afn.java:39)at clojure.core$iterat

  • 原始关闭原因未解决 我正在尝试编写一个程序,询问用户他想要生成多少安全代码,然后它会在一个数组中输出他所请求的代码。 安全代码长度应为7个字符,格式如下:NNNNLLL,其中N是随机数,L是随机大写字母。 该方法应通过随机选择字符,即数字和字母,以上述格式创建安全代码。 如果用户选择生成4个代码,我希望程序会输出这样的内容: "2394QAB""2821TSZ""7173AAY""2236WQA"

  • 问题内容: 我正在运行一个网站,并且有一个计分系统,可为您提供玩游戏次数的积分。 它使用散列来证明http请求评分的完整性,因此用户无法更改任何内容,但是正如我担心的那样,有人发现他们不需要更改它,他们只需要获得高分并复制http请求,标头和所有。 以前,我被禁止防御此攻击,因为它被认为不太可能。但是,既然已经发生,我可以。http请求源自Flash游戏,然后由php验证,然后php将其输入数据库