在java中生成100个1-10之间的随机UNIQUE双数?

时间:2017-11-19 17:34:01

标签: java random

我想生成100个唯一的随机数,但数字必须在1-10的范围内。 现在我这样做:

for (int i = 0; i < 100; i++) {
    Double n = rand.nextDouble(10) + 1;
    arr[i] = n;
}

我可以通过使用数组中的if / else语句检查它们是否唯一来获得双数,但这是非常困难和低效的,因为数字(双数)几乎是无限的。

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

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

3 个答案:

答案 0 :(得分:5)

正如您在评论中提到的那样,无法在1到100之间生成100个唯一整数。使用doubles可以让您这样做,但不会保证唯一性本身(即使有重复项目的极小机会),所以你必须自己保证 - 例如,使用Set

Set<Double> doubles = new HashSet<>();
while (doubles.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()); 

答案 1 :(得分:0)

你可以使用这样的东西。

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;
        }
    }
}

但是不可能在1-10之间获得唯一的100个整数。

以上程序生成类似这样的内容

4.142037859604101
2.655156962359073
3.7397565068261205
2.9699181925544247
2.747362791293101
3.243100861992423
9.308481386292623
4.96298205308679
3.4319099852820822
9.951375372917328
3.6941158775736316
1.0388381644118727
1.6895078811799191
0.9166823110491484
9.60259797093202
2.3365812211691708
8.556399515524168
2.570971809286772
1.6621912919374215
0.5896588206170794
6.921688301938134
6.325470591144598
2.35492413118687
2.1778674294915454

答案 2 :(得分:0)

Math类有许多有用的函数,至少还有一个可用于此的函数。

for(int i = 0; i < 100; i++) {
        double n = (Math.random()*9) + 1;
        arr[i] = n;
}

Math.random返回大于或等于0.0且小于1.0的随机正数,因此如果将其乘以9,则得到大于或等于0.0且小于9.0的数字。然后加1是确保范围在1到10之间。

如果你真的想确保所有数字都是唯一的,你可以写一个方法来检查数字是否已经在数组中。

希望这会帮助你。祝你好运!