Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中生成唯一双值的最有效方法是什么_Java_Math_Random_Double_Unique - Fatal编程技术网

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

在Java中生成唯一双值的最有效方法是什么,java,math,random,double,unique,Java,Math,Random,Double,Unique,有一些方法,例如搜索重复项,但我想知道是否有更好的解决方案来完成此任务。您可以使用流 double[] array = new Random().doubles() .distinct() .limit(500) // How many you want. .toArray(); 您可以使用Setcollection。它不

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

您可以使用

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);
}
Set doubles=新HashSet();
随机r=新随机();

对于(int i=0;i首先,您需要了解随机数生成器的工作原理。计算正整数序列,即长整数序列,其中没有双精度。该序列至少有2^31个元素长。0.0…1.0范围内的实数双精度是浮点除法的结果。浮点除法从来都不是精确的。 如果您使用这个实数在较小的间隔内生成整数,那么使用随机数生成器是最快的方法,它将从该间隔中生成正整数。 介绍了Lehmer发生器的算法 x1=(x0*m)%div x0:最后一个随机数,x1是下一个随机数。Div和m是素数。m 我的建议是: 为m=2794470273和div=4294967291的Lehmer生成器编写一个方法。我在几个网页上找到了这些数字。div=2^32-5,因此您可以确保得到一个几乎为2^32正长整数的序列,所有的序列都不同。将它们转换为double,并用div作为double进行除法。在开放间隔(0.0,…1.0)中得到double所有这些双打都是不同的。
随机整数足够小,商也不同。如果使用随机生成器生成更大的整数随机数,则无法确定double是否也不同,原因是舍入错误。

请注意,仍然需要将double转换为double;)Java会处理这个问题。您应该使用
doubles.size()<100
,否则您将得到少于100个(或者您想要的不同数字的数量是多少)。您无法避免搜索重复项。但是,您可以将其委托给库例程。@Thorbjørnravandersen如果您知道线性同余生成器的周期大于所需的样本数,则不需要搜索重复项。显然OP不知道这一点。JDK 8的另一个很好的用法。我正在尝试实践越来越多地,D.H.Lehmer的名字被拼错了(Lehmert)。D.H.Lehmer的名字被拼错了(Lehmert).m=279470273和div=4294967291是帕克和米勒的建议。div=2^32-5是素数。m也是素数。---帕克和米勒最初使用div=2147483647=2^31-1是梅森素数,m=16807=7^5。参见