在 Java 中生成随机唯一双精度值

Generating random unique double values in Java

我需要一组 64 位浮点随机数,它们应该是不同的。是否有用于此的库例程,或者我应该手动搜索重复项?

让数字不比某个非常小的常数 \epsilon 更接近实际上更重要。是否也有相应的库例程?

您可以使用 streams

double[] array = new Random().doubles()
                             .distinct()
                             .limit(500) // How many you want.
                             .toArray();

您可以使用 Set collection。它不允许插入唯一值。下面是一个例子:

Set<Double> doubles = new HashSet<Double>();
Random r = new Random();
for(int i=0 ; i<100 ; i++){
    doubles.add(r.nextDouble() * 100);
}

首先您需要了解随机数生成器的工作原理。计算了一系列正整数,长整数,其中没有双精度数。这个序列至少有 2^31 个元素长。 0.0 ..... 1.0 范围内的真正双精度是浮点数 division.Floating 点 division 的结果永远不会精确。 如果您使用此实数在较小的区间内生成整数,那么使用随机数生成器是最快的方法,它会从该区间中为您提供正整数。 Lehmer 生成器的算法是 x1 = (x0 * m) % div x0 :最后一个随机数,x1 是下一个随机数。 Div 和 m 是素数。 m < div。第一个 x0 是 select 乘以 user.called 种子数。 很明显,x_i 比 div 小。对于good random-number-generator的其他属性,没有简短的证明。

我的建议: 为 m = 279470273 和 div = 4294967291 的 Lehmer 生成器编写一个方法。我在几个网页上找到了这些数字。 Div = 2^32-5,所以你一定能得到一个将近2^32的正长整数序列,都是不同的。将它们转换为双精度和 divide 它们与 div 作为双精度。你在开区间 (0.0, ..... 1.0) 中得到双打,所有这些双打都是不同的。 随机整数足够小,商也不同。如果你使用随机生成器,生成更大的整数随机数,你不能确定,双打也不同,原因是舍入误差。