Java中随机数生成的问题
【生成随机数序列】
我们只能利用Math.random()方法只能生成一个在[0,1)之间的double类型浮点数。
但如果我们想要生成[min, max]之间的随机整数时该怎么办呢?
此时可以用:
int rdmNum = (int) (Math.random() * (max + 1 - min) + min);
【随机数生成器(存在重复随机数)】
public static int[] createRandomArray(int arrLength, int rdmMin, int rdmMax) {
//根据所给数组长度,生成所要的数组
int[] arr = new int[arrLength];
//给数组赋随机值
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (rdmMax + 1 - rdmMin) + rdmMin);
}
//返回这个数组
return arr;
}
【不重复随机数生成器】
该方法可以返回一个在[rdmMin,rdmMax]范围内的随机整数数组,实测[1, 300000]内随机数组生成耗时10476毫秒,效率不错
// 该方法可以返回一个在[rdmMin,rdmMax]范围内的随机整数数组,效率极高
public static int[] createRandomNoRepeatArray(int arrLength, int rdmMin, int rdmMax) {
// 显然,我们不能创建一个长度为100,元素随机范围为1~10的数组,并且还指望它不重复。。。
// 所以我们的数组长度不能大于随机数范围长度!
// 创建指定长度的数组
if(arrLength > (rdmMax - rdmMin + 1)){
System.out.println("数组长度不能大于随机数范围长度!");
// 程序停止运行
System.exit(0);
}
int[] rdmArr = new int[arrLength];
// 创建一个有序集合,随机数从中挑选
List<Integer> rdmNum = new ArrayList<Integer>();
// 将随机范围内的整数赋给该集合,此时显然该集合中的元素不重复
for (int i = rdmMin; i <= rdmMax; i++) {
rdmNum.add(i);
}
// 此时给指定数组赋值赋的是随机索引中的元素
for (int i = 0; i < rdmArr.length; i++) {
// 生成随机索引,这里生成的随机索引范围应该逐次减1
int index = (int) (Math.random() * (rdmMax - rdmMin + 1 - i));
// 根据随机索引获取元素
rdmArr[i] = rdmNum.get(index);
// 删除该索引的元素。删除后,后者元素自动向前补位,List集合长度减1。
rdmNum.remove(index);
}
return rdmArr;
}
【不重复随机数生成器2】
返回值类型为HashSet<Integer>,再转为int[]数组性能就会下降一些,有时候也没必要非用int[]数组
生成[1,2000000]之间的随机数耗时12580毫秒,这个是目前效率最高的。
public static HashSet<Integer> createRandomSet(int arrLength, int rdmMin, int rdmMax) {
// 实例化一个HashSet集合
HashSet<Integer> hs = new HashSet<Integer>();
while (hs.size() != arrLength) {
// 循环赋指定范围内的随机值
hs.add((int) (Math.random() * (rdmMax + 1 - rdmMin) + rdmMin));
}
return hs;
}
Java中随机数生成的问题的更多相关文章
- Java中随机数生成的两种方法,以及math的floor
1.Math的random方法,调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选 ...
- JavaSE&&JavaEE&&JavaME的区别【Java中常用的包结构】
一.javaEEJavaSEJavaME用的同一个jar包吗? javaEE JavaSE javaME 用的JDK是同一个,开发j2SE工程的话只要有JDK就可以了,开发J2EE工程和J2ME工程除 ...
- Java中产生随机数的两个方法
Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...
- 对Java中HashCode方法的深入思考
前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...
- 【Java基础】JAVA中优先队列详解
总体介绍 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序( ...
- java中的锁
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
随机推荐
- MVC之基架
参考 ASP.NET MVC5 高级编程(第5版) 定义: 通过对话框生成视图及控制器的模版,这个过程叫做“基架”. 基架可以为应用程序的创建.读取.更新和删除(CRUB)功能生成所需的样板代码.基架 ...
- JQery插件clipboard.js ----将文本复制到剪贴板的现代化方法
### 之前用了js自带的剪贴板对象clipboardData 对象以为就可以实现粘贴复制,但是种只支持IE的. 就找了jq的一个插件Zclip,但是网上的说法是利用了flesh来实现的,我用了之后可 ...
- 【MySql】join操作
飞机票 飞机票 加油 INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN( ...
- Confluence 6 整合到其他数据库
这个文档描述了如何整合你的 Confluence 数据库从你已经存在的数据库上到其他的数据库.这个指南被用来指导你从使用评估数据库转移到使用生产数据库. 大数据量需要第三方的数据库整合工具. 本页面对 ...
- Confluence 6 中样式化字体
Confluence 提供了通过层叠样式表(CSS)调整页面展示情况的能力.本页面帮助你理解如何在 Confluence 中使用一些 CSS 样式修改字体样式和字体大小. 下面的代码为自定义的字体代码 ...
- Scratch 2.0-Find The Mouse 发布!
日期:2018.8.26 星期日 博客期:007 今天随便写了一个小型游戏程序,哈哈!虽然小,但用到的逻辑还是有一定水平的.呼~毕竟就这一下子也写不出来微软一样的公司嘛!哈哈,截图放上来! 游戏分为四 ...
- 关系代数和sql语句对应关系
关系代数运算符 对应sql语句 聚合操作 ∪ (UNION)并 ∩ (INTERSECTION)交 - (DIFFERENCE)差 × (Cartesian PRODUCT)笛卡尔积 ...
- HashMap&线程
1.HashMap概念 HashMap是一个散列表,存储内容是键值对(key-value)的映射, HashMap继承了AbstractMap,实现了Map.Cloneable.java.io.Ser ...
- poj3417lca+树上差分
/* 给定n个点的树,在其中加入m条新边(称为非树边) 现在可以割断一条树边,一条非树边,使图分裂成两个联通块,请问有几种切割方式 对树边进行分情况讨论 如果树边不处在环中,则割断这条树边后可以割断任 ...
- C# Enum 类型遍历
void Main() { new EnumForeach().Foreach(); } public class EnumForeach { public void Foreach() { fore ...