使用Arraylist产生不重复的随机数
在Java中主要有两种方法来获取随机数,分别是通过Math.random方法和Random类获得随机数,不过Math.random方法其实也是通过生成一个Random类实例,然后再生成随机数的,也就是说,实际上两种方法都是使用Random类来生成随机数的。随机数的生成的与产生随机数的种子有关:
1)种子不同,就会产生不同的随机数
2)种子相同,即使是使用不同的Random实例,产生的随机数均是相同的
3)举例说明:
Random rand1=new Random();//使用默认的种子,也就是System.nanoTime()的返回值,这个值是距离某个时间点的纳秒值,可以保证产生不同的随机数,一般都是用这个
Random rand2=new Random();
Random rand3=new Random();
rand1.nextInt();
rand1.nextInt();//与上个值不同
rand2.rand1.nextInt();
rand23rand1.nextInt();//与rand2的值是相同的
4)但是,当使用以下形式式却可能会产生相同的随机数:
Random ww=new Random();
for (int i = 0; i <100 ; i++) {
System.out.println(ww.nextInt(100));
}
使用以下形式也可能会产生相同的随机数:
for (int i = 0; i <100 ; i++) {
Random ww=new Random();
System.out.println(ww.nextInt(100));
}
随机就利用Arraylist产生不重复的随机数,代码如下:
import java.util.*; /**
* Created by hfz on 2016/3/16.
*/
public class Chromosome implements Cloneable {
private double chromosomeFitness=0;
private double selectProbability=0;
private double cumulateProbability=0;
private short[] pathUsedRouterId;
private byte[][] weight;
private short totalRouterAmount;//通过读文件,得到的路由节点的总个数,这个是除了要求的源节点A、目的节点B以及必须经过的节点之外的所有节点
private short pathUsedRouterAmount;//最优路径中,除了要求的源节点A、目的节点B以及必须经过的节点之外
// 我们估算路径中要经过多少节点(从A到B不一定要经过所有的节点),是totalRouterAmount的一个子集
public Chromosome(short totalRouterAmount,short pathUsedRouterAmount,byte[][]weight){
this.totalRouterAmount=totalRouterAmount;
this.pathUsedRouterAmount=pathUsedRouterAmount;
this.weight=weight;
pathUsedRouterId=new short[pathUsedRouterAmount];
}
public void generateInitChromosome(ArrayList<Short> demandedRouter){
ArrayList<Short> allRouterId=new ArrayList<>(totalRouterAmount);//通过读文件,得到的路由节点的总个数;
ArrayList<Short> arrayListPathRouter=new ArrayList<>();
for (short i=0;i< totalRouterAmount;++i){
if (!(demandedRouter.contains(i))) {
allRouterId.add(Short.valueOf(i));
}
}
/*
//删除节点A、B。
allRouterId.remove((Object)demandedRouter[0]);//删除A,强制转换为Object的话,才会删除对应的值,否则是索引下的值
allRouterId.remove((Object)demandedRouter[1]);//删除B
for (short i=2;i<demandedRouter.length;++i) {
allRouterId.remove((Object)demandedRouter[i]);
}
*/
//Random random=new Random(1000);//固定种子的话,多次运行程序demandedRouter和pathUsedRouterId结果相同的
//java中随机数的产生取决于种子,种子不同,产生的随机数也不同,但是如果种子相同,即使实例不同也产生相同的随机数。
Random random=new Random();
int index;
//生成不重复的随机数
for (short i=0;i<pathUsedRouterAmount;++i){
index=random.nextInt(allRouterId.size());//[0,allRouterId.size())
pathUsedRouterId[i]=(Short.valueOf(allRouterId.get(index)));
arrayListPathRouter.add(i);//将路径中的节点索引
// 存到列表中,留待使用必须经过的点随机替换pathUsedRouterId中的点
allRouterId.set(index,allRouterId.get(allRouterId.size()-1));
allRouterId.remove(allRouterId.size()-1);//最后一个索引的值
}
//用必须要经过的点随机替换pathUsedRouterId中的点,要生成不重复的随机数
//arrayListPathRouter=Arrays.asList(pathUsedRouterId);
for (short i=2;i<demandedRouter.size();++i) {
index = random.nextInt(arrayListPathRouter.size());
pathUsedRouterId[arrayListPathRouter.get(index)] = (Short.valueOf(demandedRouter.get(i)));
//不是pathUsedRouterId[index] = (Short.valueOf(demandedRouter.get(i)));
//两次的index可能相同,但是即使相同,其实在arrayListPathRouter.get(index)中对应的索引值其实是不同的
arrayListPathRouter.set(index, arrayListPathRouter.get(arrayListPathRouter.size() - 1));
arrayListPathRouter.remove(arrayListPathRouter.size() - 1);
} System.out.println(demandedRouter);
System.out.println(Arrays.toString(pathUsedRouterId));
}
public static void main(String[] args){ byte[][] test={{1,2},{3,4}};
Short[] tt={0,1,2,3,4,8,9,12};
//List tt1=Arrays.asList(tt);
Chromosome c1=new Chromosome((short)25,(short)17,test);
c1.generateInitChromosome(new ArrayList<Short>(Arrays.asList(tt)));
}
}
参考:
http://blog.csdn.net/p106786860/article/details/9465055
https://www.zhihu.com/question/30091884
使用Arraylist产生不重复的随机数的更多相关文章
- Java的ArrayList实现随机生成N-M之间N个不重复的随机数
在此之前我使用Java的数组实现了产生N-M之间的不重复的随机数,下面是使用数列ArrayList实现同样的功能,代码如下: /** * 随机生成 N--M,N个不重复随机数 使用ArrayList ...
- 论 Java 中获取一组不重复的随机数之性能问题
今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...
- 生成count个[0-n)不重复的随机数
代码来自:https://www.cnblogs.com/ningvsban/p/3590722.html,感觉实现的方式不错(做了一点小小修改) public static ArrayList ge ...
- ArrayList实现删除重复元素(元素不是对象类型的情况)
package 集合; import java.util.ArrayList;import java.util.Iterator; /* * 去除ArrayList里面的重复元素 * * */pub ...
- C#产生不重复的随机数并生成随机文件名
本文转自:http://blog.ciznx.com/post/csharprandomnumberandrandomfilename.aspx 在项目中会遇到需要批量生成文件的时候,比如 asp.n ...
- JavaScript 不重复的随机数
在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?本文给于解决方法,需要的朋友可以参考下 在 JavaScript 中,一般产生的随机数会重复,但 ...
- [转载][记录]javascript生成不重复的随机数
参考链接:javascript生成不重复的随机数 项目播放视频,是无序的,有上下两个按钮,所以需要生成1,8不重复的随机数数组,如: ,,,,,,, 然后再split一次,就是数组了. 拿来主义了
- 生成N个不重复的随机数(转)
有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? 当然向上级反映情况.但是 ...
- 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 ...
随机推荐
- Python-Jenkins API使用
一.概述 最近在工作中需要用到在后台代码中触发Jenkins任务的构建,于是想到Jenkins是否有一些已经封装好的API类库提供,用于处理跟Jenkins相关的操作.下面就简单介绍下我的发现. 二. ...
- Shell之基本用法
一:shell简介 1.什么是shell shell的中文意思是“外壳”,通俗地讲,shell是一个交互编程接口,通过获得用户输入来驱动操作系统内核完成指定工作.shell除了作为命令解释程序以外,还 ...
- 知问前端——按钮UI
按钮(button),可以给生硬的原生按钮或者文本提供更多丰富多彩的外观.它不单单可以设置按钮或文本,还可以设置单选按钮和多选按钮. 使用button按钮 使用button按钮UI的时候,不一定必须是 ...
- 【BZOJ3132】上帝造题的七分钟 [树状数组]
上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description “第一分钟,X说,要有矩阵 ...
- swift中的尾随闭包的用法
尾随闭包就是这个函数的最后一个参数是一个闭包,所以规定这个闭包既可以写在函数的参数括号里面,也可以直接放在最后面来使用,就像重新给这个函数定义了一次一样,有些怪,不过用的时候,可以把闭包写在外面的.这 ...
- HDU 1840 Equations (数学)
title: Equations 数学 杭电1840 tags: [数学] 题目链接 Problem Description All the problems in this contest tota ...
- bzoj 1007 凸壳
首先明确一个概念 左面内个叫上凸壳,右面那个叫下凸壳 然后我们只需要维护一个上图壳就行了,先按着斜率排序,每次加进来一条边,判断tot边和这个边与tot-1边的交点横坐标, 如果这条边的横坐标小就一直 ...
- python3 生成器表达式
生成器表达式 [i for i in range(100)] #列表解析 与列表解析的不同是,列表解析用中括号,生成器表达式用小括号 g = (i for i in range(1000)) #生成器 ...
- 《linux下进程的创建,执行,监控和终止》
<linux下进程的创建,执行,监控和终止> http://blog.csdn.net/miss_acha/article/details/43671047 http://blog.csd ...
- 关于ES6(ES2015)开发记坑
ES2015(以下简称ES6)在开发过程中遇到的问题: 1,必须显示声明变量 //es5中可解释为全局变量 a=5; //es6中报错:a is not defined a=5 2,对于递归调用方式必 ...