java随机数字不重复,java怎么生成不重复的随机数

  java随机数字不重复,java怎么生成不重复的随机数

  如何解决写爬虫IP受阻的问题?立即使用。

  本文介绍了如何在JAVA中实现随机不重复数的功能。(相关视频课程推荐:java视频教程)

  为了更好的理解这个问题的含义,我们先来看一下具体的内容:生成一个1-100的随机数组,但是数组中的数字不能重复,也就是位置是随机的,但是数组的元素不能重复。

  这里,我们没有给出数组的长度。我们可以将它设为1到100之间的任意长度。

  接下来,我们来看看几种实现方式,并进行比较。

  我们通常用ArrayList或者array来实现。我们先来看看ArrayList的实现过程,如下面的代码所示:

  导入Java . util . ArrayList;

  导入Java . util . random;

  /**

  *使用ArrayList实现

  * @描述:

  * @ File:Demo.java

  * @日期2012-10-18下午06:16:55

  * @版本1.0

  */

  公开课演示{

  公共静态void main(String[] args) {

  Object[] values=新对象[20];

  Random Random=new Random();

  ArrayListInteger list=new ArrayListInteger();

  for(int I=0;I值.长度;i ){

  int number=random . nextint(100)1;

  如果(!list.contains(number)){

  list.add(数字);

  }

  }

  values=list . to array();

  //遍历数组并打印数据

  for(int I=0;I值.长度;i ){

  system . out . print(values[I] \ t );

  if((I ^ 1)% 10==0){

  system . out . println( \ n );

  }

  }

  }

  }使用数组的过程如下:

  导入Java . util . random;

  /**

  *使用数组实现

  * @描述:

  * @ File:Demo4.java

  * @包无

  * @作者韩永禄

  * @日期2012-10-18下午06:27:38

  * @版本1.0

  */

  公共类演示4 {

  公共静态void main(String[] args) {

  int[]values=new int[20];

  Random Random=new Random();

  for(int I=0;I值.长度;i ){

  int number=random . nextint(100)1;

  for(int j=0;j=I;j ){

  如果(数字!=values[j]){

  values[I]=数字;

  }

  }

  }

  //遍历数组并打印数据

  for(int I=0;I值.长度;i ){

  system . out . print(values[I] \ t );

  if((I ^ 1)% 10==0){

  system . out . println( \ n );

  }

  }

  }

  }以上两个实现过程效率低下。因为每次添加都要遍历当前列表中是否存在这个数,时间复杂度为O (n 2)。让我们这样想:既然不涉及重复,我们可以考虑HashSet和HashMap的功能。

  HashSet实现了Set接口,Set的数学定义是没有重复和顺序的集合。HashMap实现了Map,这也是一个不能重复的键。这可以通过使用HashMap或HashSet来实现。

  使用HashMap实现时,只需要将其键转换成数组,如下面的代码所示:

  导入Java . util . hashmap;

  导入Java . util . iterator;

  导入Java . util . random;

  导入Java . util . map . entry;

  /**

  *使用HashMap实现

  * @描述:

  * @ File:Demo.java

  * @包无

  * @作者韩永禄

  * @日期2012-10-18下午06:12:50

  * @版本1.0

  */

  公开课演示{

  公共静态void main(String[] args) {

  int n=0;

  Object[] values=新对象[20];

  Random Random=new Random();

  HashMapObject,Object hashMap=new HashMapObject,Object();

  //生成随机数并将它们存储在HashMap中

  for(int I=0;I值.长度;i ){

  int number=random . nextint(100)1;

  hashMap.put(number,I);

  }

  //从HashMap导入数组

  values=hashMap.keySet()。to array();

  //遍历数组并打印数据

  for(int I=0;我值。长度;i ){

  系统。出去。print(values[I] \ t );

  如果((I ^ 1)% 10==0){

  系统。出去。println( \ n );

  }

  }

  //迭代器iter=hashMap.entrySet().迭代器();

  ////遍历模拟

  //while (iter.hasNext()) {

  //EntryInteger,整数Entry=(Entry)ITER。next();

  //int key=entry。getkey();

  //n;

  //

  //系统。出去。print(键 \ t );

  //

  //if(n % 10==0){

  //系统。出去。println( \ n );

  //}

  //}

  }

  }由于哈希特和模拟的关系太近了,哈希集在底层就是用模拟来实现的,只不过没有价值的集合,只有一个钥匙的集合,所以也可使用哈希特来实现,如下代码:

  导入Java。util。hashset

  导入Java。util。随机;

  /**

  * 使用哈希特实现

  * @描述:

  * @ File:Test.java

  * @包无

  * @作者韩永禄

  * @日期2012-10-18下午06:11:41

  * @版本1.0

  */

  公共类测试{

  公共静态void main(String[] args) {

  Random Random=new Random();

  对象[]值=新对象[20];

  HashSetInteger hashSet=new HashSetInteger();

  //生成随机数字并存入哈希特

  for(int I=0;我值。长度;i ){

  int数=random。nextint(100)1;

  hashSet.add(数字);

  }

  values=hashset。to array();

  //遍历数组并打印数据

  for(int I=0;我值。长度;i ){

  系统。出去。print(值[I] \ t );

  如果((I ^ 1)% 10==0){

  系统。出去。println( \ n );

  }

  }

  }

  }这样实现效率稍微好些。如果给我们限定了数组的长度,只需要变换下为循环,设置成循环语句循环就可以了。如下所示:

  导入Java。util。hashset

  导入Java。util。随机;

  /**

  * 使用哈希特实现

  * @描述:

  * @ File:Test.java

  * @包无

  * @作者韩永禄

  * @日期2012-10-18下午05:11:41

  * @版本1.0

  */

  公共类测试{

  公共静态void main(String[] args) {

  Random Random=new Random();

  对象[]值=新对象[20];

  HashSetInteger hashSet=new HashSetInteger();

  //生成随机数字并存入哈希特

  while(hashset。size()值。长度){

  哈希特。补充(随机。nextint(100)1);

  }

  values=hashset。to array();

  //遍历数组并打印数据

  for(int I=0;我值。长度;i ){

  系统。出去。print(值[I] \ t );

  如果((I ^ 1)% 10==0){

  系统。出去。println( \ n );

  }

  }

  }

  }以上几种相比较而言,使用模拟的效率是比较高的,其实是哈希集,再次是数组,最后是数组列表。如果我们生成10000个数据将会发现,使用模拟花费时间是:0.05秒,哈希集是0.07秒,数组是:0.20秒,而数组列表是0.25秒。有兴趣的可以设置下时间查看一下。

  当然了,除了使用模拟实现外,还有其它高效的方法。比如,我们可以把1-100这些数字存储在一个数组中,然后在为循环中随机产生两个下标,如果这两个下标不相等的话,可以交换数组中的元素,实现过程如下所示:

  导入Java。util。随机;

  /**

  * 随机调换位置实现

  * @描述:

  * @ File:Demo4.java

  * @包无

  * @作者韩永禄

  * @日期2012-10-18下午06:54:06

  * @版本1.0

  */

  公共类演示4 {

  公共静态void main(String[] args) {

  int values[]=new int[100];

  int温度1、温度2、温度3

  Random r=new Random();

  for(int I=0;我值。长度;i ){

  值[I]=I ^ 1;

  }

  //随机交换值。长度次

  for(int I=0;我值。长度;i ){

  temp 1=math . ABS(r . nextint())%(values . length-1);//随机生成一个位置

  temp 2=math . ABS(r . nextint())%(values . length-1);//随机生成另一个位置

  if(temp1!=温度2){

  temp 3=values[temp 1];

  值[temp1]=值[temp 2];

  值[temp 2]=temp 3;

  }

  }

  //遍历数组并打印数据

  for(int I=0;i 20i ){

  system . out . print(values[I] \ t );

  if((I ^ 1)% 10==0){

  system . out . println( \ n );

  }

  }

  }

  }更多java相关文章,请关注java基础教程。以上是java生成不重复随机数方法的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: