在java中生成100个1-10之间的随机唯一双精度数字?

在java中生成100个1-10之间的随机唯一双精度数字?,java,random,Java,Random,我想生成100个唯一的随机数,但这些数必须在1-10之间。 现在,我正在这样做: for (int i = 0; i < 100; i++) { Double n = rand.nextDouble(10) + 1; arr[i] = n; } for(int i=0;i

我想生成100个唯一的随机数,但这些数必须在1-10之间。 现在,我正在这样做:

for (int i = 0; i < 100; i++) {
    Double n = rand.nextDouble(10) + 1;
    arr[i] = n;
}
for(int i=0;i<100;i++){
双n=rand.nextDouble(10)+1;
arr[i]=n;
}
我可以通过使用数组中的if/else语句检查它们是否唯一来获得双倍数,但这非常困难且效率低下,因为数字(双倍数)几乎是无限的

那么,在不使用数组的情况下,如何确保数字是唯一的呢


java中是否有不允许重复元素的数据结构?

正如您在评论中提到的,无法生成1到100之间的100个唯一整数。使用
双倍
可以做到这一点,但不能保证其自身的唯一性(即使获得重复项目的可能性微乎其微),因此您必须自己保证这一点-例如,使用
集合

Set<Double> doubles = new HashSet<>();
while (doubles.size() < 100) {
    doubles.add(1 + rand.nextDouble() * 9);
}
Set doubles=new HashSet();
while(加倍.size()<100){
doubles.add(1+rand.nextDouble()*9);
}
编辑:
JDK 8提供了一种可以说更优雅的方式,通过流实现这一点:

List<Double> doubles =
    rand.doubles()
        .distinct()
        .map(d -> 1 + d * 9)
        .limit(100)
        .boxed()
        .collect(Collectors.toList()); 
双倍列表=
兰特双打()
.distinct()
.地图(d->1+d*9)
.限额(100)
.boxed()
.collect(Collectors.toList());

您可以使用类似的方法

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        double[] arr  = new double[100];
        for (int i = 0; i < 100; i++) {
            Random rand = new Random();
            double n = 10*rand.nextDouble();
            System.out.println(n);
            arr[i] = n;
        }
    }
}

Math类有一系列有用的函数,也至少有一个可以用于此目的

for(int i = 0; i < 100; i++) {
        double n = (Math.random()*9) + 1;
        arr[i] = n;
}
for(int i=0;i<100;i++){
双n=(Math.random()*9)+1;
arr[i]=n;
}
Math.random返回一个大于或等于0.0且小于1.0的随机正数,因此如果将其乘以9,则得到一个大于或等于0.0且小于9.0的数字。然后加1是确保范围在1到10之间

如果确实要确保所有数字都是唯一的,可以编写一个方法来检查该数字是否不在数组中


希望这能帮到你。祝你好运

那么问题到底是什么呢?我已经在1-10之间生成了100个随机数(整数),但它们必须是唯一的。我可以用nextDouble()而不是nextInt()来做吗?那是不可能的。不能有100个介于1和10之间的唯一整数。只有10:1、2、3、4、5、6、7、8、9和10。是的,您需要生成随机的双倍数。然后调用
nextFloat
/
nextDouble
。只需按
0.1
递增,然后随机跳过。一旦你得到100个“唯一”的双值,就打破你的循环。我看不出第二个解决方案在哪方面会更优雅。别误会我的意思,你表现出完全不同的方法真是太好了!我只是不明白怎么会更好。它更慢,更难阅读,唯一积极的方面是它适合单行线,第一个解决方案也可以。我有什么遗漏吗?不管怎样,巨大的+1
Math.random()
的返回值在
[0,1)
的范围内,而不是
(0,1)
。它可以等于
0
。只是为了不混淆任何人
for(int i = 0; i < 100; i++) {
        double n = (Math.random()*9) + 1;
        arr[i] = n;
}