`
iflytek_wjzhu
  • 浏览: 38810 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android日记之2012/02/15——随机不重复数

阅读更多
      今天在检查代码的时候,发现了一个关于含有不重复随机数的使用的陷阱。一开始在看代码的时候,并没有发现这个问题,但是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。

      当然,这只是我个人的做法,我也相信能有人比我用更有效的方法来实现这种随机数不重复(因为要比对前面存在的数字,所以要做循环,如果取的随机数比较多的话,我这种方法的效率比较低),大家不妨交流下。
0
0
分享到:
评论
2 楼 iflytek_wjzhu 2012-02-28  
黯然小伙 写道
我来说个我自己的做法。首先,创建一个ArrayList来存放随机数。当我从0到15的数字中取随机数的时候,我就把这个数字和ArrayList中存在的值比对一下,如果有则接着取下一个随机数,如果没有,就添加到ArrayList中。当我ArrayList的大小为15 的时候,我就不需要再添加值了,现在肯定是有0到15之间的15个不同额随机数了。那我再按照顺序从ArrayList中取这15个数出来,作为ValueList中值的对应位置在ValueList中取值。


这样的话如果运气不好的话,岂不是要随机很多次。没必要。随机下标就好了。。
//初始化
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i <= 15; i++) {
			list.add(i);
		}
		//不重复随机数
		for (int i = 0; i < 100; i++) {
			//随机下标
			int index = new Random().nextInt(list.size());
			//取出
			System.out.println(list.get(index));
			//删除
			list.remove(index);
			//判断是否取完
			if(list.isEmpty()){
				break;
			}
		}

嗯,自己写了一个Demo,看了下,理解了~~~谢谢,很不错的方法~~~
1 楼 黯然小伙 2012-02-24  
我来说个我自己的做法。首先,创建一个ArrayList来存放随机数。当我从0到15的数字中取随机数的时候,我就把这个数字和ArrayList中存在的值比对一下,如果有则接着取下一个随机数,如果没有,就添加到ArrayList中。当我ArrayList的大小为15 的时候,我就不需要再添加值了,现在肯定是有0到15之间的15个不同额随机数了。那我再按照顺序从ArrayList中取这15个数出来,作为ValueList中值的对应位置在ValueList中取值。


这样的话如果运气不好的话,岂不是要随机很多次。没必要。随机下标就好了。。
//初始化
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i <= 15; i++) {
			list.add(i);
		}
		//不重复随机数
		for (int i = 0; i < 100; i++) {
			//随机下标
			int index = new Random().nextInt(list.size());
			//取出
			System.out.println(list.get(index));
			//删除
			list.remove(index);
			//判断是否取完
			if(list.isEmpty()){
				break;
			}
		}

相关推荐

    Toxi / Oxy Pro 便携式气体检测仪参考手册 使用说明书

    Toxi Oxy Pro 便携式气体检测仪参考手册 使用说明书

    科傻模拟网优化操作-教程书

    官方的的说明书资料,部分视频说明在这里: https://www.bilibili.com/video/BV1Fz4y1d7rn/?spm_id_from=333.999.0.0&vd_source=13dc65dbb4ac9127d9af36e7b281220e

    node-v8.14.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2023商业银行数据资产体系白皮书,主要介绍了“三位一体”数据资产体系的构成与工作机制,以及商业银行数据资产体系建设实践

    2023商业银行数据资产体系白皮书 目录 第 1 章 数据资产化与数据要素市场化相辅相成,相互促进 第 2 章 数据资产化是企业数据治理向上演进的必经之路 第 3 章 数据资产体系发展概述 第 4 章 “三位一体”数据资产体系的构思 4.1“三位一体”数据资产体系的构成与工作机制 数据资产管理 数据资产运营 数据资产评价 数据资产体系工作机制 4.2“三位一体”数据资产体系的相互作用关系 4.3“三位一体”数据资产体系的构建 4.4“三位一体”数据资产体系的优势 第 5 章 商业银行数据资产体系建设实践 5.1商业银行开展数据资产体系建设的背景和目标 5.2商业银行数据资产体系建设的工作步骤 5.3上海银行数据资产体系建设实践的主要成果 第 6 章 数据要素流通市场赋能企业数据资产化 6.1全国多层次数据要素市场的建设 6.2上海数据交易所赋能企业数据资产化 6.3数据要素流通交易市场赋能企业数据资产化的展望 第 7 章 未来演进与展望

    基于微信小程序的助农扶贫小程序

    大学生毕业设计、大学生课程设计作业

    车辆销售数据Python爬取并做数据分析,项目源码注解清晰一看就懂.zip

    车辆销售数据Python爬取并做数据分析,项目源码注解清晰一看就懂

    毕业设计:基于SSM的mysql-学生社团管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_学生社团管理系统(源码 + 数据库 + 说明文档) 第2章 主要技术和工具介绍 1 2.1 JSP语言 1 2.2 MySQL数据库 1 2.3 jsp技术 2 2.4ssm简介 3 第3章 系统分析 1 3.1可行性分析 1 3.1.1经济可行性 1 3.1.2技术可行性 1 3.1.3操作可行性 1 3.2需求分析 1 3.3业务流程分析 2 3.4数据流程分析 3 第4章 系统设计 5 4.1系统结构设计 5 4.2功能模块设计 5 4.3数据库设计 6 4.3.1数据库设计概述 6 4.3.1概念设计 6 4.3.2表设计 7 第5章 系统实现 15 5.1基本任务 15 5.2登录模块的实现 15 5.2.1首页实现 15 5.2.2管理员后台登录 16 5.3用户模块的实现 19 5.3.1注册模块及登录的实现 19 5.2.2入团模块的实现 21 5.2.3场地预约模块的实现 22 5.4管理员模块的实现 24 5.4.1系统用户管理模块的实现 24 5.4.2活动公告管理模块的实现 26 5.5社团模块的实现 28 5.5.1活动信息

    大健康零售业务O2O数字化战略规划方案.pptx

    大健康零售业务O2O数字化战略规划方案.pptx

    数据中台项目主要岗位及其职责和任务

    数据中台项目主要岗位及其职责和任务

    node-v8.0.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    流程制造行业数字化智能工厂总体规划建设方案.pptx

    流程制造行业数字化智能工厂总体规划建设方案.pptx

    c语言学生成绩管理系统源码.zip

    c语言学生成绩管理系统源码.zip

    DEV-C++-5.11下载链接

    DEV-C++-5.11下载链接

    电器租赁小程序.zip

    电器租赁小程序.zip

    学生成绩管理系统 数据结构与算法课程设计 C++.zip

    学生成绩管理系统 数据结构与算法课程设计 C++

    知乎小程序算法.zip

    知乎小程序算法.zip

    基于R语言SIR传染病传播的SIR模型,很全,可直接应用仿真模拟.rar

    基于R语言SIR传染病传播的SIR模型,很全,可直接应用仿真模拟.rar

    node-v6.13.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v10.11.0-darwin-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    项目申报系统(Struts2+Spring+Hibernate+Jsp+Mysql5).zip

    广东工业大学工程管理

Global site tag (gtag.js) - Google Analytics