疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java随机数高效生成


 

   

  近期去面试经常被问到java如何生产随机数,以及生成很大的字符串保证不能重复,还要考虑性能,之前本人面试别人的时候,可能不会问这个问题。既然这个java随机数问题经常被问到,那咱们也就写几种实现方式吧。仅供参考。

  1.1.1. 第一种方式

  第一种方式,咱们考虑一下,生成的字符串不能重复,怎么办呢?首先想到hashMap、hashSet的特性吧。那怎么就先用这种方式实现吧。以下是hashMap的实现方式。

  public static void main(String[] args) {

  Object[] values = new Object[100];

  Random random = new Random();

  HashMap

  // 生成随机数字并存入HashMap

  for(int i = 0;i < values.length;i++){

  int number = random.nextInt(100) + 1;

  hashMap.put(number, i);

  }

  values=hashMap.keySet().toArray();

  // 遍历数组并打印数据

  for(int i = 0;i < values.length;i++){

  System.out.print(values[i] + " ");

  }

  }

  这里需要注意的就是hashMap中的增长因子的问题了。要尽量避免HashMap中的数组扩容问题。

  hashMap中的构造函数两个参数的含义:

  初始容量,加载因子。

  1.1.2. 第二种方式

  可以把希望生成的值放入到一个数组中,然后程序随机去读取数组中任意两个坐标,如果坐标相等则继续随机,如果坐标不相等,就交换两个坐标的值。具体的实现如下:

  int values[] = new int[100];

  int temp1,temp2,temp3;

  Random r = new Random();

  //初始化数组

  for(int i = 0;i < values.length;i++){

  values[i] = i + 1;

  }

  //随机交换values.length次

  for(int i = 0;i < values.length;i++){

  temp1 = Math.abs(r.nextInt()) % (values.length-1); //随机产生一个位置

  temp2 = Math.abs(r.nextInt()) % (values.length-1); //随机产生另一个位置

  if(temp1 != temp2){

  temp3 = values[temp1];

  values[temp1] = values[temp2];

  values[temp2] = temp3;

  }

  }

  // 遍历数组并打印数据

  for(int i = 0;i < 20;i++){

  System.out.print(values[i] + " ");

  }

  1.1.3. 总结

  个人觉得数组第二种的方式比较快,因为数组的访问速度快。这也是数组结构决定的。