`
h5566h
  • 浏览: 74440 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

一种快速获取N个不同随机数的方法

阅读更多

     因为项目需要,需要写一个算法来获取在F范围内,获取N个不同的值的算法,因为random方法产生的值,是有可能存在相同的值,所以,选出来的值以后需要把相同的值去掉,因此根据这个思路,便有了以下的算法:

 

public static int[] randomInt(int n, int f) {
		int intRet[] = new int[n];
		int intRd = 0;
		int count = 0;
		
			while (count < n) {
			Random rdm = new Random(System.currentTimeMillis());
			intRd = rdm.nextInt(f);
			int flag = 0;
			for (int i = 0; i < count; i++) {
				if (intRet[i] == intRd) {					
					flag=1;
					break;					
				}			
			}
			if(flag==0){
				intRet[count]=intRd;
				count++;
			}
		}
		
		return intRet;
	}

    

     原理很简单,就是随机生成N个数,然后通过循环去掉相同的。但是这个算法效率很差,特别是要选取的数字的个数超过1000以后,这个算法几乎需要1、2秒。因此为了解决这个问题,我引入了HashSet。因为Set内是不允许存在相同的值的,于是利用这个特性,写出了这个算法。

 

public static int[] randomSet(int n, int f){
		Random rdm = new Random(System.currentTimeMillis());
		Set<Integer> intSet =  new HashSet<Integer>();
		
		while(intSet.size()<n){
			intSet.add(rdm.nextInt(f));			
		}
		
		
		int intRet[] = new int[n];
		Iterator<Integer> it = intSet.iterator();
		int i=0;
		while(it.hasNext()&i<n){
			intRet[i] = Integer.parseInt(it.next().toString());
			i++;						
		}
		
		return intRet;		
	}

 其实这个算法就是利用了Set的特性,去除相同的数值,而且这个算法效率非常高,特别是选取的数超过1000个的时候,效率可以比前面的算法提高上百倍。

分享到:
评论

相关推荐

    delphi生成随机数

    在每次获取随机数时,以随机种子为基础进行某种特殊的运算,获得一个随机数并返回之,然后再对随机种子进行某种运算,改变随机种子的值。这样,就可以生成许多比较随机的数,但同一个初始值的随机种子将会生成完全...

    DES数据加密

    使用这个方法,已经可以产生这样的一个表,表的顺序是随机,所以产生这256个字节的随机数使用的是二次伪随机,使用了两个额外的16位的密码.现在,已经有了两张转换表,基本的加密解密是如下这样工作的。前一个字节...

    你必须知道的495个C语言问题

    2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 枚举 2.23 枚举和一组预处理的#define有什么不同? 2.24 枚举可移植吗? 2.25 有什么显示枚举值符号的容易方法吗? 位域 2.26 一些结构声明中的这些...

    《你必须知道的495个C语言问题》

    2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 30 枚举 31 2.23 枚举和一组预处理的#define有什么不同? 31 2.24 枚举可移植吗? 31 2.25 有什么显示枚举值符号的容易方法吗? 31 位域 31 2.26 ...

    数据结构与算法.xmind

    能通过任何一个节点找到其他所有的节点,将两种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环 常见操作 添加数据到链表中 遍历找到尾节点,插入即可(只要while(temp.next != null),...

    Java范例开发大全 (源程序)

     实例127 一个文件变成多个小文件 178  实例128 多个小文件合成一个文件 181  实例129 统计指定文件中的字符个数 183  实例130 对象的序列化与反序列化 185  实例131 同时显示多个文件 187  实例132 生成...

    java范例开发大全(pdf&源码)

    实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时显示多个文件 187 实例132 生成zip压缩文件 189 ...

    java范例开发大全源代码

     实例127 一个文件变成多个小文件 178  实例128 多个小文件合成一个文件 181  实例129 统计指定文件中的字符个数 183  实例130 对象的序列化与反序列化 185  实例131 同时显示多个文件 187  实例132...

    java范例开发大全

    实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时显示多个文件 187 实例132 生成zip压缩文件 189 ...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序...

    Java范例开发大全(全书源程序)

    实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时显示多个文件 187 实例132 生成zip压缩文件...

    EXCEL集成工具箱V6.0

    【快捷综合取数】 功能较&lt;快捷取数列&gt;功能更强大,支持同时取6个不同存储格区域(或列)为6个唯一值清单,并在指定的6个不同的生效范围自适应地显示对应的清单。清单的最后6项也为子程序功能,能完成相关操作。且...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【快捷综合取数】 功能较&lt;快捷取数列&gt;功能更强大,支持同时取6个不同存储格区域(或列)为6个唯一值清单,并在指定的6个不同的生效范围自适应地显示对应的清单。清单的最后6项也为子程序功能,能完成相关操作。且...

    javascript入门笔记

    1、声明一个变量 r ,来表示一个圆的半径,并赋值 2、声明一个常量PI ,来表示圆周率3.14 3、通过 r 和 PI 来计算 该圆的周长,保存在变量l中 周长 = 2 * π * 半径 4、通过 r 和 PI 来计算 该圆的面积,保存在...

    C#编程经验技巧宝典

    72 &lt;br&gt;0102 将字符串首字母转换大写 72 &lt;br&gt;0103 如何进行字节数组和字符串的相互转换 72 &lt;br&gt;0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73 &lt;br&gt;4.2 获取字符串信息 73 ...

    C语言通用范例开发金典.part2.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    C语言通用范例开发金典.part1.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    C 开发金典

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

Global site tag (gtag.js) - Google Analytics