在Java中生成唯一double值的最有效方法是什么

有一些方法,如搜索重复项,但我想知道是否有更好的解决方案来完成这项任务。

您可以使用streams

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

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

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

首先,您需要了解随机数生成器的工作原理。 计算出一系列正整数,长整数,其中没有双精度。 该序列至少为2 ^ 31个元素长。 0.0 …… 1.0范围内的实际双精度是浮点除法的结果。浮点除法从不精确。 如果你使用这个实数来生成较小区间的整数,那么使用随机数生成器是最快的方法,它可以从该区间给出正整数。 Lehmer生成器的算法是x1 =(x0 * m)%div x0:最后一个随机数,x1是下一个随机数。 Div和m是素数。 m

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