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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。