【Java编程】随机数的不重复选择
随机数的不重复选择就是从n个数中随机选取m(m<n)个数。在本文中,我们用Java来实现。因此我们先介绍Java的相关知识。
在Java中,Java.util.Set接口和Java.util.List接口一样,都是继承自Java.util.Collection接口。但是两者有不同的特点:
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个数),然后产生一个随机数,以随机数为下标来取出样本空间的数,并且将该数从样本空间删除。该算法的缺点是原始样本空间不能有重复的数,当样本空间很大的时候,会占用很多内存空间。当然还有几种算法也可以选择,具体请查看下一篇文章。
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接口的特性。
原文:http://blog.csdn.net/tengweitw/article/details/24395949
作者:nineheadedbird
【Java编程】随机数的不重复选择的更多相关文章
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串
java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...
- Java编程基础-选择和循环语句
一.选择结构语句 选择结构:也被称为分支结构.选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码. Java语言提供了两种选择 ...
- java 获取随机数的三种方法
方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...
- Java获取随机数的几种方法
Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...
- Java编程的逻辑 (34) - 随机
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Java编程的逻辑 (40) - 剖析HashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- Java编程中“为了性能”尽量要做到的一些地方
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...
- JAVA编程“性能说”(java编程需要做的26件事)
转载于 http://www.csdn.net/article/2012-06-01/2806249 最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过 ...
随机推荐
- Android线性布局
线性布局 LinearLayout 是一个视图组,用于使所有子视图在单个方向(垂直或水平)保持对齐. 您可以使用 android:orientation 属性指定布局方向. LinearLayout ...
- Android中GridView的一些特殊属性
GridView的一些特殊属性: 1.android:numColumns="auto_fit" //GridView的列数设置为自动 2.android:columnWidt ...
- Android逆向工程
在Root前提下,我们可以使用Hooker方式绑定so库,通过逆向方式篡改数值,从而达到所谓破解目的.然而,目前无论是软件加固方式,或是数据处理能力后台化,还是客户端数据真实性验证,都有了一定积累和发 ...
- Android4.3 屏蔽HOME按键返回桌面详解(源码环境下)
点击打开链接 首先声明我是做系统开发的(高通平台),所以下面介绍的方法并不适合应用开发者. 最经有个需求要屏蔽HOME按键返回桌面并且实现自己的功能,发现以前的方式报错用不了,上网搜索了一下,发现都是 ...
- 13 SQLiteOpenHelper SQLiteDatabase详解
创建数据库: 1. 创建一个类继承SQLiteOpenHelper 2. 创建继承对象 new SQLiteOpenHelper() 3. 用创建的对象获取可写或者可读的SQLiteDatabase ...
- UNIX网络编程——epoll的 et,lt关注点
epoll模型有两种工作模式,ET和LT两种模式下都有一些细节值得注意,以下是一些思考: 一.ET模式下 Q1:调用accept时,到底TCP完成队列里有多少个已经建立好的连接? 这 ...
- EBS中的采购单据状态及其控制
李 颖 (济南钢铁股份有限公司 装备部,山东 济南 250101) 摘 要:介绍了Oracle Purchasing模块中采购单据的管理与控制,结合实例,分析了各状态下可采取的控制活动及控制活 ...
- 一步步创建Qt Widget项目+TextFinder案例(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)
创建一个基于应用的QtWidget应用程序 这个手册描述了怎样使用QtCreater创建个一个小的Qt应用程序,Text Finder.它是Qt工具Text Finder例子的简写版本.这个应用 ...
- RecyclerView下拉刷新上拉加载(一)
listview下拉刷新上拉加载扩展(一) http://blog.csdn.net/baiyuliang2013/article/details/50252561 listview下拉刷新上拉加载扩 ...
- TCP协议三次握手与四次挥手详解
在计算机网络的学习中TCPi协议与Http协议是我们必须掌握的内容,其中Tcp协议属于传输层,而Http协议属于应用层,本博客主要讲解Tcp协议中的三次握手与四次挥手,关于Http协议感兴趣的可以参看 ...