今天在检查代码的时候,发现了一个关于含有不重复随机数的使用的陷阱。一开始在看代码的时候,并没有发现这个问题,但是Debug 的时候,就发现错了。其实,就是一个很浅显的问题,主要还是写给刚进入程序员这行的朋友。
先把问题重现下,我们需要对0到15 的数字中取随机数,通过这个随机数,来保证在ValueList(为了和后面的ArrayList区分)中取到的值不重复。我并不清楚最早的做法是怎么写的,反正说是太损耗资源,就改用把ValueList中对应位置的值remove掉。觉得这样就能保证取到的值不重复了。
对吗?错。为什么?因为,列表中的值remove掉了以后,并不是说当前的位置就空出来了,就比如说,一个列表中的位置是0、1、2、3,当我把2位置的值remove了以后,只是把3位置的值前移一格,对应的值还是0、1、2,不会变成0、1、3的。
那对于这种取不重复随机数怎么做呢?
我来说个我自己的做法。首先,创建一个ArrayList来存放随机数。当我从0到15的数字中取随机数的时候,我就把这个数字和ArrayList中存在的值比对一下,如果有则接着取下一个随机数,如果没有,就添加到ArrayList中。当我ArrayList的大小为15 的时候,我就不需要再添加值了,现在肯定是有0到15之间的15个不同额随机数了。那我再按照顺序从ArrayList中取这15个数出来,作为ValueList中值的对应位置在ValueList中取值。
其实,这种随机数不重复还是有应用场合的。比如说,从一个题库中取出一批题目出来,那如何保证每次生成的题目的顺序不一样,同时,在一次做题序列中,保证题目是不重复的,就可以用到这种随机数不重复的List。
当然,这只是我个人的做法,我也相信能有人比我用更有效的方法来实现这种随机数不重复(因为要比对前面存在的数字,所以要做循环,如果取的随机数比较多的话,我这种方法的效率比较低),大家不妨交流下。
分享到:
相关推荐
android自定义效果——随机抽奖
安卓Android源码——随机验证码.zip
安卓Android源码——安卓Android随机验证码.rar
安卓Android源码——日记本.zip
C#开发Android应用实战——使用Mono for Android和.NET/C#(移动与嵌入式开发技术)是一本很不错的书籍,但网上下载的多是不完整的。该版本是完整版。希望对大家有所帮助。
安卓Android源码——安卓Android随机验证码.zip
黑马程序员——Android移动开发源码
15. android dialog ——列表对话框
Android小项目——新闻APP(源码),一个很简单的可以练手的Android Demo Ps:下载之前可以先看一下这篇文章——https://blog.csdn.net/qq_34149526/article/details/80992341
安卓Andriod源码——随机验证码.zip
Android源码——数据库SQLite.zip
https://github.com/GXS1225/Android————-.git 分析 (1)判断是否输入了账号和密码 if(name.trim().equals()){ Toast.makeText(this, 请您输入用户名!, Toast.LENGTH_SHORT).show(); return;
安卓Android源码——android相册系统(用Matrix实现).rar
Android——okhttp的封装,Android——okhttp的封装,Android——okhttp的封装,Android——okhttp的封装,Android——okhttp的封装
Android TCP测试demo,包含apk和源码,支持十六进制发送接收,以太网和wifi的IP获取以及网线插拔监听,Android Things 1.0版本与Android 8.0均测试通过。WIFI和网线均可通信。可参看博文UI功能...
XModulable Latest Version SDK XModulable-api XModulable-compiler XModulable-annotation ...上层通过路由层查找组件/模块,通过组件/模块暴露的服务... android { defaultConfig { ... javaCompileOptions {
Android源码——宿舍值日随机生成器.zip