在 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) 中得到双打,所有这些双打都是不同的。
随机整数足够小,商也不同。如果你使用随机生成器,生成更大的整数随机数,你不能确定,双打也不同,原因是舍入误差。
我需要一组 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) 中得到双打,所有这些双打都是不同的。 随机整数足够小,商也不同。如果你使用随机生成器,生成更大的整数随机数,你不能确定,双打也不同,原因是舍入误差。