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

时间:2016-03-20 21:04:01

标签: java math random double unique

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

3 个答案:

答案 0 :(得分:11)

您可以使用streams

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

首先,您需要了解随机数生成器的工作原理。计算出一系列正整数,长整数,其中没有双精度。该序列长至少2 ^ 31个元素。 0.0 ...... 1.0范围内的实际双精度是浮点除法的结果。浮点除法永远不会精确。 如果你使用这个实数来生成较小区间的整数,那么使用随机数生成器是最快的方法,它可以从该区间给出正整数。 Lehmer发电机的算法是 x1 =(x0 * m)%div x0:最后一个随机数,x1是下一个随机数。 Div和m是素数。 m&lt; DIV。第一个x0由user.called种子号选择。 很明显,x_i比div小。对于好的随机数发生器的其他属性,没有简短的证据。

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