博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成N个不相等的随机数
阅读量:6933 次
发布时间:2019-06-27

本文共 2015 字,大约阅读时间需要 6 分钟。

          近期项目中须要生成N个不相等的随机数。实现的时候。赶工期,又有项目中N非常小(0-100)直接谢了一个最直观的方法:

public static List
randomSet(int num,int threshold){ Random random = new Random(); if(num > threshold) return null; Set
randomset = new HashSet
(); while(randomset.size() < num) randomset.add(random.nextInt(threshold)); List
result = new ArrayList
(); result.addAll(randomset); return result ; }
       仅仅要是依据HashSet 的来去重,到达不相等的随机数,可是当num比較大。或者num 比較接近threshold 的时候。这个时候平均期望比較大num*threshold*lognum 的复杂度

      其它类似的方法还有比方使用一个数组来标记某个数字是否已经标记到。复杂度同上

以下主要讲两个复杂度分别为num 和 threshold 的方法:

 

    方法 1 : 置乱(shuffle)。代码例如以下:

 

public static List
random_shuffle(int num,int thresold){ Random rd = new Random(); List
result = new ArrayList
(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
random_2(int num , int thresold){ Random rd = new Random(); List
target = new ArrayList
(thresold); for(int i = 0 ;i < thresold ;i++) target.add(i+1); List
result = new ArrayList
(); 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; }

转载地址:http://cuwnl.baihongyu.com/

你可能感兴趣的文章
Windows不能在本地计算机启动MongoDB,错误代码 100
查看>>
2016 、12 、11<本周>
查看>>
jQuery 之 serialize() serializeArray()
查看>>
JSONP跨域jQuery处理整理(附天气数据实例)
查看>>
第十四周项目2-带姓名的成绩单
查看>>
Docker使用自定义网络实现容器互联
查看>>
VSCode 小鸡汤 第00期 —— 安装和入门
查看>>
庖丁解牛Nop:控制反转--IOC和DI
查看>>
python项目中requirements的巧用(一键导入所有安装包)
查看>>
CCNP交换实验(3) -- STP
查看>>
MySql之触发器【过度变量 new old】
查看>>
制作生成静态页面的新闻系统
查看>>
HAOI 树上操作
查看>>
【译】.NET Core 是 .NET 的未来
查看>>
[NOIP2012提高组]开车旅行
查看>>
SSH项目的简单table及其分页框架
查看>>
Objective-C单例
查看>>
【总结】IE6,IE7,IE8,Firefox兼容的css hack 补充!
查看>>
【剑道】用语中日对照
查看>>
[CF494D]Birthday
查看>>