随机数的不重复选择就是从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. PHP Ajax JavaScript 实现 无刷新附件上传

    普通表单 前端页面 后台处理 带有文件的表单 刷新方式 前端界面 后台页面 无刷新方式 大文件上传 POST极值 upload极值 上传细节 前端页面 后台处理 总结 对一个网站而言,有一个基本的不可 ...

  2. Velocity 语法及其在springMVC中的配置

    强烈推荐具体的整合博客:http://blog.csdn.net/duqi_2009/article/details/47752169 整合文章中有几处问题: xml中配置的vm视图解析器,应该按照本 ...

  3. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field 异常

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 1.1.1. 前言 近期在使用ObjectMapper对象将jso ...

  4. [apache2.4]configure: error: APR not found. Please read the documentation.

    apache2.4 安装出现如下错误 ``` [lzz@localhost httpd-2.4.10]$ ./configure  checking for chosen layout... Apac ...

  5. 阻塞IO服务器模型之多线程服务器模型

    针对单线程服务器模型的特点,我们可以对其进行改进,使之能对多个客户端同时进行响应.最简单的改进即是使用多线程(或多进程)服务器模型,在应用层级别,我们一般采用多线程模式.多线程能让多个客户端同时请求, ...

  6. Effective C++ ——实现

    条款26:尽可能延后变量定义式的出现时间 当你定义一个变量的时候就要保证这个变量能够在程序中使用到,不要定义无意义的变量,这样就要求我们最好是在变量使用到的时候才做定义,因为如果一个变量定义了却不使用 ...

  7. PullToRefreshScrollView 嵌套RecyclerView实现特卖列表倒计时抢购

    不久之前,我们谈到了通过Handler与timer及TimerTask结合实现倒计时抢购列表,那个是PullToRefreshListView实现的,今天要讲的是PullToRefreshScroll ...

  8. javascript中的AJAX

    兼容地获得XMLHttpRequest对象: var xhr = null; if(window.XMLHttpRequest){ //非IE浏览器 xhr = window.XMLHttpReque ...

  9. UNIX网络编程——select函数的并发限制和 poll 函数应用举例

    一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置,  ...

  10. 3.QT中的debug相关的函数,以及文件锁的使用

     1  新建项目T33Debug main.cpp #include <QDebug> #include <QFile> #include <QMutex>   ...