随机数的不重复选择就是从n个数中随机选取m(m<n)个数。在本文中,我们用Java来实现。因此我们先介绍Java的相关知识。

在Java中,Java.util.Set接口和Java.util.List接口一样,都是继承自Java.util.Collection接口。但是两者有不同的特点:

      List接口:一种能包含重复元素的有序集合,具体实现该接口的类有:Vector、Stack、ArrayList、LinkedList等等.
      Set接口:一种不包含重复元素的集合,常见的实现该接口的类有:HashSet、LinkedHashSet、TreeSet。

       为什么要想决解这个问题呢?因为在我仿真过程中,经常要用到随机数。比如随机的选取几个信道,随机的选取一定范围内的几个值。当然如果只是随机的选取一个值,直接用随机函数就可以了。但是当要选取多个值的时候,就可能出现重复的值(这不是我们所期望的)!下面分别通过实现上述两个接口的类来实现随机数的不重复选择。

1.用实现List接口的向量来实现:
   
package tengwei.com;

import java.util.*;

public class UseVector {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Vector<Integer> vec=selectSeven();//调用函数
		Enumeration<Integer> enu=vec.elements();//得到向量中所有元素的枚举
		while(enu.hasMoreElements())//遍历向量中的所有元素
			System.out.println(enu.nextElement()+"\t");
		Object obj[]=vec.toArray();//把向量vec转化为Oject数组
		Arrays.sort(obj);//升序排序
		System.out.println("升序排列后:");
		for(int i=0;i<obj.length;i++)
			System.out.println(obj[i]+"\t");

	}
	/**从1-36中随机选择7个不重复的数 */
	public static Vector<Integer> selectSeven()
	{
		Random rd= new Random();//创建随机数对象
		Vector<Integer> allNum = new Vector<Integer>();//存放1-36
		Vector<Integer> sevenNum = new Vector<Integer>();//存放选择的7个数
		for(int i=0;i<36;i++)
			allNum.add(new Integer(i+1));//向向量allNum中添加36个数

		int x;
		for(int i=0;i<7;i++)
		{
			x=rd.nextInt(36-i);//得到0-(36-i)中随机数,不包含36-i
			sevenNum.add(allNum.get(x));
			allNum.remove(x);
		}
		return sevenNum;

	}

}

本算法的基本思想就是先用Vector保存你的样本空间(36个数),然后产生一个随机数,以随机数为下标来取出样本空间的数,并且将该数从样本空间删除。该算法的缺点是原始样本空间不能有重复的数,当样本空间很大的时候,会占用很多内存空间。当然还有几种算法也可以选择,具体请查看下一篇文章。


2.用实现Set接口的HashSet、TreeSet类来实现
       首先分别介绍HashSet、TreeSet类:
       HashSet类:该类实现了Set接口,由哈希表支持。它不保证集合的迭代顺序。该类不含参数的构造方法构造了一个空的哈希集,默认初始容量是16,加载因子是0.75。
       TreeSet类:该类实现了Set接口的子接口SortedSet。它保证迭代器按照元素递增顺序遍历。插入该类的所有元素必须是可相互比较的,因为它必须保证递增顺序。
package tengwei.com;

import java.util.*;

public class UseHashSetTreeSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Set<Integer> hashset = hashSelect(7);//调用函数,返回哈希集
		System.out.println("HashSet中所有元素(未排列)");
		System.out.println("\t"+hashset);

		SortedSet<Integer> treeset = treeSelect(7);//调用函数,返回数集
		System.out.println("TreeSet中所有元素(升序)");
		System.out.println("\t"+treeset);

	}

	public static Set<Integer> hashSelect(int k)
	{
		Random rd = new Random();
		Set<Integer> hs= new HashSet<Integer>();

		while(hs.size()<k)
		{
			int x=1+rd.nextInt(36);//随机1-36之间的数,包括两边
			hs.add(new Integer(x));
		}
		return hs;
	}

	public static SortedSet<Integer> treeSelect(int k)
	{
		Random rd = new Random();
		SortedSet<Integer> ts= new TreeSet<Integer>();

		while(ts.size()<k)
		{
			int x=1+rd.nextInt(36);
			ts.add(new Integer(x));//当重复时不会添加
		}
		return ts;
	}

}

上面的算法比较简单,比较巧妙的用到了Set接口的特性。


【Java编程】随机数的不重复选择的更多相关文章

  1. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...

  2. Java编程基础-选择和循环语句

    一.选择结构语句 选择结构:也被称为分支结构.选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码. Java语言提供了两种选择 ...

  3. java 获取随机数的三种方法

    方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...

  4. Java获取随机数的几种方法

    Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...

  5. Java编程的逻辑 (34) - 随机

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  6. Java编程的逻辑 (40) - 剖析HashMap

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  8. Java编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  9. JAVA编程“性能说”(java编程需要做的26件事)

    转载于 http://www.csdn.net/article/2012-06-01/2806249 最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过 ...

随机推荐

  1. LAB颜色空间各通道的取值范围

    简介 LAB颜色空间在计算机视觉中经常被使用,知道L,A,B三个通道的取值范围有一定的意义. OpenCV获取LAB取值范围 下面是一段实验代码,用于获取LAB的取值范围. 基本思路是,排列组合所有R ...

  2. Android艺术开发探索第三章————View的事件体系(下)

    Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动 ...

  3. EBS业务学习之应付INVOICE类型

    INVOICE类型 类      型 描           述 标准INVOICE 是指由于采购货物或接受劳务,从供应商处取得的INVOICE (标准INVOICE,既可以和订单匹配,也可以不匹配) ...

  4. TensorFlow与OpenCV,读取图片,进行简单操作并显示

    TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...

  5. 10 GridView 样式属性

    GridView 样式属性: 1,android:numColumns="auto_fit" 显示的列数 如果android:numColumns不设置那么自动每行1列 如下图 2 ...

  6. Android播放在线音乐文件

    Android播放在线音频文件 效果图: 源码下载地址: http://download.csdn.net/detail/q4878802/9020687 添加网络权限: <uses-permi ...

  7. 第一行代码阅读笔记----显示隐式Intent的基本用法

    1.显示Intent意图明显,通过Intent启动另外一个活动,这是安卓中各组件进行交互的一种重要方式.一般用于启动活动,启动服务,发送广播等场景. 实现方法,这里我只说思路,实践还是要自己实操才能明 ...

  8. iOS开发之使用block块进行数据遍历的方法

    看了一篇文章,发现遍历数组.字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法. 首先是最基本的运用形式, ...

  9. Socket层实现系列 — send()类发送函数的实现

    主要内容:socket发送函数的系统调用.Socket层实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 发送流程图 以下是send().sendt ...

  10. 01_MyBatis EHCache集成及所需jar包,ehcache.xml配置文件参数配置及mapper中的参数配置

     1 与mybatis集成时需要的jar ehcache-core-2.6.5.jar mybatis-ehcache-1.0.2.jar Mybatis.日志.EHCache所需要的jar包如下 ...