在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。参见