有一些方法,比如搜索重复项,但我想知道是否有更好的解决方案来完成这项任务。
答案 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)得到双打,所有这些双打都是不同的。 随机整数足够小,商也不同。如果你使用随机生成器,它产生更大的整数随机数,你不能确定,双打也是不同的,原因是舍入错误。