我是靠谱客的博主 聪明宝贝,最近开发中收集的这篇文章主要介绍java创建大量随机的不重复的数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在面试的时候有时候会被问到这样的问题,如何在最短时间内创建50w条不重复且随机的数? 这里给出三个方法(方法肯定不止这三种)

1. 第一种,使用Set集合

利用Set集合不重复的特点,我们可以Random一个数,往Set中插入数据,直到Set集合的大小满足我们要的数量

 public static void aa(int n){
    Set r = new LinkedHashSet(n);
    Random random = new Random();

    while (r.size() < n ) {
      int i = random.nextInt(n );
      r.add(i);
    }
    System.out.println(Arrays.toString(r.toArray()));
  }

我们选n=10看看效果

public static void main(String[] args) {
    int n = 10;
    long a = Clock.systemDefaultZone().millis();
    aa(n);
    long b = Clock.systemDefaultZone().millis();
    System.out.println("完成.时间是:"+(b-a));
}

可以看到是瞬间完成,也满足了乱序不重复的要求
在这里插入图片描述

2.第二种,利用java8的Stream流

这个也是无意中发现的

public static void bb(int n ){
    List<Integer> r = new Random().ints(0, n).distinct().limit(n).boxed().collect(Collectors.toList());
    System.out.println(Arrays.toString(r.toArray()));
  }

可以看到也是满足要求,但是时间比第一种多了一些
在这里插入图片描述

3.第三种,数组换序

直接循环生成一个1到50w的数组应该是最简单最有效率的,但是要满足随机的条件,还得给他换顺序

public static void cc(int n){
    int[] x = new int[n];
    for(int i = 0; i < n; i++)
    {
      x[i] = i;
    }
    Random r = new Random();
    for(int i = 0; i < n; i++)
    {
      int in = r.nextInt(n - i) + i;
      int t = x[in];
      x[in] = x[i];
      x[i] = t;
    }
    System.out.println(Arrays.toString(x));
  }

时间是0毫秒,也是能满足要求
在这里插入图片描述

4.比较

重头戏自然就是比较三个方法的快慢了,先试试50w

  public static void main(String[] args) {
    int n = 500000;
    long a = Clock.systemDefaultZone().millis();
    aa(n);
    long b = Clock.systemDefaultZone().millis();
    System.out.println("第一张完成.时间是:"+(b-a));

    long a1 = Clock.systemDefaultZone().millis();
    bb(n);
    long b1 = Clock.systemDefaultZone().millis();
    System.out.println("第二种完成.时间是:"+(b1-a1));

    long a2 = Clock.systemDefaultZone().millis();
    cc(n);
    long b2 = Clock.systemDefaultZone().millis();
    System.out.println("第三种完成.时间是:"+(b2-a2));

  }

可以看到第三种是时间最短的,只要15毫秒.第二种比第一种快了一倍,但是一开始数量少的时候却比第一种慢一些

这是因为第一种往Set中插入数据的时候,数据量越大,耗时越久,比如50w的数据,到499999的时候,需要在50w的数里面,Random一个唯一的数出来才能结束, 也就是说在50w个球里面,你伸手进去找一个球,没找到,把球返回去再拿一个球 按伪随机数这里其实例子不一定准确,但是肯定是越到后面符合要求的也难找

第二种其实原理也跟第一种类似,只是java8的Stream流操作进行了一些封装和处理.所以不推荐
在这里插入图片描述

在尝试1kw的数的时候, 第一种整整花了25605毫秒,第二种25610毫秒,第三种565毫秒

最后

以上就是聪明宝贝为你收集整理的java创建大量随机的不重复的数的全部内容,希望文章能够帮你解决java创建大量随机的不重复的数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部