在Java中主要有两种方法来获取随机数,分别是通过Math.random方法和Random类获得随机数,不过Math.random方法其实也是通过生成一个Random类实例,然后再生成随机数的,也就是说,实际上两种方法都是使用Random类来生成随机数的。随机数的生成的与产生随机数的种子有关:

1)种子不同,就会产生不同的随机数

2)种子相同,即使是使用不同的Random实例,产生的随机数均是相同的

3)举例说明:

  1. Random rand1=new Random();//使用默认的种子,也就是System.nanoTime()的返回值,这个值是距离某个时间点的纳秒值,可以保证产生不同的随机数,一般都是用这个
  2. Random rand2=new Random();
  3. Random rand3=new Random();
  4. rand1.nextInt();
  5. rand1.nextInt();//与上个值不同
  6. rand2.rand1.nextInt();
  7. rand23rand1.nextInt();//与rand2的值是相同的

4)但是,当使用以下形式式却可能会产生相同的随机数:

  1. Random ww=new Random();
  2. for (int i = 0; i <100 ; i++) {
  3. System.out.println(ww.nextInt(100));
  4. }

使用以下形式也可能会产生相同的随机数:

  1. for (int i = 0; i <100 ; i++) {
  2. Random ww=new Random();
  3. System.out.println(ww.nextInt(100));
  4. }

随机就利用Arraylist产生不重复的随机数,代码如下:

  1. import java.util.*;
  2.  
  3. /**
  4. * Created by hfz on 2016/3/16.
  5. */
  6. public class Chromosome implements Cloneable {
  7. private double chromosomeFitness=0;
  8. private double selectProbability=0;
  9. private double cumulateProbability=0;
  10. private short[] pathUsedRouterId;
  11. private byte[][] weight;
  12. private short totalRouterAmount;//通过读文件,得到的路由节点的总个数,这个是除了要求的源节点A、目的节点B以及必须经过的节点之外的所有节点
  13. private short pathUsedRouterAmount;//最优路径中,除了要求的源节点A、目的节点B以及必须经过的节点之外
  14. // 我们估算路径中要经过多少节点(从A到B不一定要经过所有的节点),是totalRouterAmount的一个子集
  15. public Chromosome(short totalRouterAmount,short pathUsedRouterAmount,byte[][]weight){
  16. this.totalRouterAmount=totalRouterAmount;
  17. this.pathUsedRouterAmount=pathUsedRouterAmount;
  18. this.weight=weight;
  19. pathUsedRouterId=new short[pathUsedRouterAmount];
  20. }
  21. public void generateInitChromosome(ArrayList<Short> demandedRouter){
  22. ArrayList<Short> allRouterId=new ArrayList<>(totalRouterAmount);//通过读文件,得到的路由节点的总个数;
  23. ArrayList<Short> arrayListPathRouter=new ArrayList<>();
  24. for (short i=0;i< totalRouterAmount;++i){
  25. if (!(demandedRouter.contains(i))) {
  26. allRouterId.add(Short.valueOf(i));
  27. }
  28. }
  29. /*
  30. //删除节点A、B。
  31. allRouterId.remove((Object)demandedRouter[0]);//删除A,强制转换为Object的话,才会删除对应的值,否则是索引下的值
  32. allRouterId.remove((Object)demandedRouter[1]);//删除B
  33. for (short i=2;i<demandedRouter.length;++i) {
  34. allRouterId.remove((Object)demandedRouter[i]);
  35. }
  36. */
  37. //Random random=new Random(1000);//固定种子的话,多次运行程序demandedRouter和pathUsedRouterId结果相同的
  38. //java中随机数的产生取决于种子,种子不同,产生的随机数也不同,但是如果种子相同,即使实例不同也产生相同的随机数。
  39. Random random=new Random();
  40. int index;
  41. //生成不重复的随机数
  42. for (short i=0;i<pathUsedRouterAmount;++i){
  43. index=random.nextInt(allRouterId.size());//[0,allRouterId.size())
  44. pathUsedRouterId[i]=(Short.valueOf(allRouterId.get(index)));
  45. arrayListPathRouter.add(i);//将路径中的节点索引
  46. // 存到列表中,留待使用必须经过的点随机替换pathUsedRouterId中的点
  47. allRouterId.set(index,allRouterId.get(allRouterId.size()-1));
  48. allRouterId.remove(allRouterId.size()-1);//最后一个索引的值
  49. }
  50. //用必须要经过的点随机替换pathUsedRouterId中的点,要生成不重复的随机数
  51. //arrayListPathRouter=Arrays.asList(pathUsedRouterId);
  52. for (short i=2;i<demandedRouter.size();++i) {
  53. index = random.nextInt(arrayListPathRouter.size());
  54. pathUsedRouterId[arrayListPathRouter.get(index)] = (Short.valueOf(demandedRouter.get(i)));
  55. //不是pathUsedRouterId[index] = (Short.valueOf(demandedRouter.get(i)));
  56. //两次的index可能相同,但是即使相同,其实在arrayListPathRouter.get(index)中对应的索引值其实是不同的
  57. arrayListPathRouter.set(index, arrayListPathRouter.get(arrayListPathRouter.size() - 1));
  58. arrayListPathRouter.remove(arrayListPathRouter.size() - 1);
  59. }
  60.  
  61. System.out.println(demandedRouter);
  62. System.out.println(Arrays.toString(pathUsedRouterId));
  63. }
  64. public static void main(String[] args){
  65.  
  66. byte[][] test={{1,2},{3,4}};
  67. Short[] tt={0,1,2,3,4,8,9,12};
  68. //List tt1=Arrays.asList(tt);
  69. Chromosome c1=new Chromosome((short)25,(short)17,test);
  70. c1.generateInitChromosome(new ArrayList<Short>(Arrays.asList(tt)));
  71. }
  72. }

参考:

http://blog.csdn.net/p106786860/article/details/9465055

https://www.zhihu.com/question/30091884

使用Arraylist产生不重复的随机数的更多相关文章

  1. Java的ArrayList实现随机生成N-M之间N个不重复的随机数

    在此之前我使用Java的数组实现了产生N-M之间的不重复的随机数,下面是使用数列ArrayList实现同样的功能,代码如下: /** * 随机生成 N--M,N个不重复随机数 使用ArrayList ...

  2. 论 Java 中获取一组不重复的随机数之性能问题

    今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...

  3. 生成count个[0-n)不重复的随机数

    代码来自:https://www.cnblogs.com/ningvsban/p/3590722.html,感觉实现的方式不错(做了一点小小修改) public static ArrayList ge ...

  4. ArrayList实现删除重复元素(元素不是对象类型的情况)

    package 集合; import java.util.ArrayList;import java.util.Iterator; /* * 去除ArrayList里面的重复元素 *  * */pub ...

  5. C#产生不重复的随机数并生成随机文件名

    本文转自:http://blog.ciznx.com/post/csharprandomnumberandrandomfilename.aspx 在项目中会遇到需要批量生成文件的时候,比如 asp.n ...

  6. JavaScript 不重复的随机数

    在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?本文给于解决方法,需要的朋友可以参考下     在 JavaScript 中,一般产生的随机数会重复,但 ...

  7. [转载][记录]javascript生成不重复的随机数

    参考链接:javascript生成不重复的随机数 项目播放视频,是无序的,有上下两个按钮,所以需要生成1,8不重复的随机数数组,如: ,,,,,,, 然后再split一次,就是数组了. 拿来主义了

  8. 生成N个不重复的随机数(转)

    有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? 当然向上级反映情况.但是 ...

  9. js生成1-100不重复的随机数及生成10个1-100不重复的随机数

    //生成1-100不重复的随机数 var count=100; var a=new Array(); for(var i=0;i<100;i++){ a[i]=i+1; } a.sort(fun ...

随机推荐

  1. hadoop之HDFS与MapReduce

    Hadoop历史 雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 随后在2003 ...

  2. missing blocks错误

    Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXX ...

  3. Spring学习--HelloWorld

    Spring: Spring 是一个开源框架. Spring 是为简化企业级应用开发而生,使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是一 ...

  4. RPC-Thrift(四)

    Client Thrift客户端有两种:同步客户端和异步客户端. 同步客户端 同步客户端比较简单,以RPC-Thrift(一)中的的例子为基础进行研究源码,先看一下类图. TServiceClient ...

  5. Chrome 本地通信

    http://blog.csdn.net/ztmaster/article/details/52684772

  6. 【BZOJ3942】Censoring [KMP]

    Censoring Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一个S串和一个T串,长 ...

  7. 【洛谷 P1712】 [NOI2016]区间 (线段树+尺取)

    题目链接 emmm看起来好像无从下手, \(l_i,r_i\)这么大,肯定是要离散化的. 然后我们是选\(m\)个区间,我们先对这些区间按长度排个序也不影响. 排序后,设我们取的\(m\)个区间的编号 ...

  8. python基础之函数(自定义函数)

    函数: 函数的定义: 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数. ...

  9. (转)自动安装VIM插件

    转自: http://xwz.me/wiki/doku.php?id=vim:plugins 我的插件列表 把下面GetLatestVimScripts.dat放进~/.vim/GetLatest/目 ...

  10. string与double的互相转换

    #include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...