生成N个不相等的随机数
近期项目中须要生成N个不相等的随机数。实现的时候。赶工期,又有项目中N非常小(0-100)直接谢了一个最直观的方法:
public static List<Integer> randomSet(int num,int threshold){
Random random = new Random();
if(num > threshold) return null;
Set<Integer> randomset = new HashSet<Integer>();
while(randomset.size() < num)
randomset.add(random.nextInt(threshold));
List<Integer> result = new ArrayList<Integer>();
result.addAll(randomset);
return result ;
}
仅仅要是依据HashSet 的来去重,到达不相等的随机数,可是当num比較大。或者num 比較接近threshold 的时候。这个时候平均期望比較大num*threshold*lognum 的复杂度
其它类似的方法还有比方使用一个数组来标记某个数字是否已经标记到。复杂度同上
以下主要讲两个复杂度分别为num 和 threshold 的方法:
方法 1 : 置乱(shuffle)。代码例如以下:
public static List<Integer> random_shuffle(int num,int thresold){
Random rd = new Random();
List<Integer> result = new ArrayList<Integer>(thresold);
for(int i = 0 ;i < thresold ;i++)
result.add(i+1);
for(int i = thresold; i > 0;i--)
swap(result,i-1,rd.nextInt(thresold));
return result.subList(0, num);
}
将一个存有thresold 的数组,随机打乱顺序,然后返回前面num 个就可以。也能够直接使用Collections.shuffle(list)方法。看源代码可知,shuffle的算法也是如此。时间复杂度为threshold
方法 2 使用两个数组一个数组result 用来存结果 。target用来存1到threshold 个数,每次从去一个小于threshold的随机数 r,然后从target 中取出放到result 中,同一时候,target 中交换r 和threshold-1的数。同一时候threshold--。这样保证这个数字以后再也不会取到。
代码例如以下:
public static List<Integer> random_2(int num , int thresold){
Random rd = new Random();
List<Integer> target = new ArrayList<Integer>(thresold);
for(int i = 0 ;i < thresold ;i++)
target.add(i+1);
List<Integer> result = new ArrayList<Integer>();
for(int i = 0 ; i < num ;i++){
int r = rd.nextInt(thresold);
result.add(target.get(r));
swap(target, r, thresold-1);
thresold--;
}
return result;
}
生成N个不相等的随机数的更多相关文章
- 在一定[min,max]区间,生成n个不重复的随机数的封装函数
引:生成一个[min,max]区间的一个随机数,随机数生成相关问题参考→链接 var ran=parseInt(Math.random()*(max-min+1)+min); //生成一个[min,m ...
- PHP函数:生成N个不重复的随机数
思路:将生成的随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. 程序: <?php /* * array unique_rand( int $min, int $max, ...
- 生成N个不重复的随机数(转)
有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? 当然向上级反映情况.但是 ...
- PHP CodeBase: 生成N个不重复的随机数
有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? <?php /* ...
- 利用Java API生成50到100之间的随机数
利用Java API生成50到100之间的随机数 /** * */ package com.you.demo; import java.util.Random; /** * @author Admin ...
- 使用C++生成1-33中的6个随机数,无重复
生成1-33中的6个随机数,无重复 ------------------------------------------------------------------------ 方法1.每生成 ...
- php生成N个不重复的随机数实例
思路: 将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. /* * array unique_rand( int $min, int $max, int $num ) * 生 ...
- Java连载81-枚举类型,生成五个不重复的随机数,集合简介
一.枚举类型 1.枚举类型的格式就是enum+枚举类型的名称,可见下面的例子. package com.bjpowernode.java_learning; public class D81_1_ ...
- C\C++ 生成各位数不相等的随机数
最近想写一个1A2B的小游戏来练习一下,结果在第一步生成随机数的时候就遇到了一点点问题. 游戏初始化时需要先生成一个四位随机数,且各位各不相等.于是最开始的思路是生成一个整数数组,只需要判断生成的随机 ...
随机推荐
- HDU 1003 Max Sum(DP)
点我看题目 题意 : 就是让你从一个数列中找连续的数字要求他们的和最大. 思路 : 往前加然后再判断一下就行. #include <iostream> #include<stdio. ...
- Java中堆和栈创建对象的区别
http://blog.csdn.net/hbhhww/article/details/8152838
- Hibernate的优缺点
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...
- Visual Studio 那些隐藏的调试功能(转)
原文出处: 微软互联网开发支持 Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...
- 【PythonChallenge】Level 4
如题,是一个链表,N多数据,其中还有其它操作,比较麻烦,也是刚学python网络编程.对于Perl的RE很熟悉,还没有学python的,还是啃手册吧.其中在读出16044时,并没有找到匹配项,如下图所 ...
- Android开发UI之去掉title bar
去掉屏幕上的title bar有3个方法: 1.java代码实现: @Override publicvoid onCreate(Bundle savedInstanceState) { super.o ...
- 对easyUI中课堂源码编辑改进建议
在孙宇老师讲得Easyui第10讲完后,基本的增删该查做出来了,但是编辑存在一个问题:行内样式编辑修改,如果当用户没有修改数据,孙宇老师讲得时候直接return,这样做是不合理的:第二次再使用右键编辑 ...
- 结合Zen Coding快速编写HTML代码(sublime text2篇)
首先说下,如何在sublime text2加上zen coding插件 按 Ctrl+`(就是~这个键) 复制下面的代码 确认 重新启动sublime text2 import urllib2,os; ...
- JavaScript window.location对象
JavaScript window.location对象 示例 注意 方法 经常使用window.location,它的结构总是记不住,简单梳理下,方便以后查询. 示例 URL:http://b. ...
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]
[续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者:此外,当一个事务型操作超出了本机的范 围,出现了跨机器的调用后,本机的DTC需要于 ...