生成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 4814 Golden Radio Base
详解见:http://blog.csdn.net/tri_integral/article/details/18666797 #include<cstdio> #include<cs ...
- jQuery.Validate自定义规程的使用案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- POJ 2492 A Bug's Life(并查集)
http://poj.org/problem?id=2492 题意 :就是给你n条虫子,m对关系,每一对关系的双方都是异性的,让你找出有没有是同性恋的. 思路 :这个题跟POJ1703其实差不多,也是 ...
- memcached远程 telnet 无法连接,解决方案
因为默认的Memcached配置,使用了本机ip:127.0.0.1 ,此时利用VI修改下配置 vi /etc/memcached.conf 文件打开后,修改下,把-l前面加入#号注释掉,重启服务器就 ...
- webbench的详细使用
webbench是什么?是一款相当给力的网站压力测试工具.(优点自行搜索) 使用webbench需要两大步骤: 1.安装webbench 2.熟悉webbench命令 一.安装webbench 1.下 ...
- USB Type-C 应用面临安全性考验,USB-IF 将推动新认证机制
USB 应用已经达到空前盛况,横跨电脑.移动设备.周边设备.影音器材等范畴,是一个极为普遍常见的界面.进入 USB Type-C 世代由于一并推动 USB-PD,过去没有严格执行的认证要求,基于安全性 ...
- 【HDOJ】2430 Beans
这题目用线段树超时了,其实也差不多应该超时.10^6大数据量.看了一下网上的解法是单调队列.大概了解了一下,是个挺有意思的数据结构.首先,需要求满足0<=(S[r]-S[l])%p<=k时 ...
- hadoop异常: 到目前为止解决的最牛逼的一个异常(java.io.IOException: Incompatible clusterIDs)
(注意: 本人用的版本为hadoop2.2.0, 旧的版本和此版本的解决方法不同) 异常为: 9 (storage id DS-2102177634-172.16.102.203-50010-1384 ...
- hadoop2.2编程:用ruby跑hadoop的完整实例
Becareful! All nodes include need to install ruby! #!/usr/bin/ruby # Ruby code for map.rb ARGF.eac ...
- ORA-28001: the password has expired
大早上正式库提示: Oracle提示错误消息ORA-28001: the password has expired 解决办法: 1.利用SYSDBA权限登陆: 2.查看账户信息:select user ...