java - 如何在 Java 中创建一个随机的 BigDecimal?

标签 java math random biginteger bigdecimal

本题:How to generate a random 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 纠正了我对比例参数的理解。以上不是必需的,恒定的比例因子具有预期的效果。

供以后引用,我的(显然有效的代码)是:

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 个十进制数字的均匀分布数字,生成小于 10*N 的统一 BigInteger 并将其缩小 10*N。

关于java - 如何在 Java 中创建一个随机的 BigDecimal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900262/

相关文章:

java - 执行程序服务的并发数组访问

java - 使用 spring-data-redis 将 500k 条记录插入到 redis 中

java - java中UUID转换为int

math - 将秒转换为日、时、分和秒

c# - 哪种解决方案更适合从数据库获取随机记录集?

java - JVM中的最大线程数?

math - 查找模拟时钟中时针和分针之间的角度

c++ - 在具有固定常数离散化的给定网格上使用 C++ 进行数值积分

java - 设置屏幕属性 View

r - 如何根据 R 中的 3d 加权数组生成随机数?