java产生随机数的三种方式
转自:https://blog.csdn.net/YTTmiao/article/details/78187448
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串、数字。或者随即生成一个不定长度的数字、或者进行一个模拟的随机选择等等。Java提供了最基本的工具,可以帮助开发者来实现这一切。
一、Java随机数的产生方式
在Java中,随机数的概念从广义上将,有三种。
1、通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。
2、通过Math.random()返回一个0到1之间的double值。
3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。
二、Random类API说明
1、Java API说明
Random类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。
如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证属性的实现,为类 Random 指定了特定的算法。
很多应用程序会发现 Math 类中的 random 方法更易于使用。
2、方法摘要
- Random()
- 创建一个新的随机数生成器。
- Random(long seed)
- 使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。
- protected int next(int bits)
- 生成下一个伪随机数。
- boolean nextBoolean()
- 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 boolean 值。
- void nextBytes(byte[] bytes)
- 生成随机字节并将其置于用户提供的字节数组中。
- double nextDouble()
- 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0之间均匀分布的 double 值。
- float nextFloat()
- 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 float 值。
- double nextGaussian()
- 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。
- int nextInt()
- 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
- int nextInt(int n)
- 返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。
- long nextLong()
- 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 long 值。
- void setSeed(long seed)
- 使用单个 long 种子设置此随机数生成器的种子。
三、Random类使用说明
1、带种子与不带种子的区别Random类使用的根本是策略分带种子和不带种子的Random的实例。
通俗说,两者的区别是:带种子的,每次运行生成的结果都是一样的。
不带种子的,每次运行生成的都是随机的,没有规律可言。
2、创建不带种子的Random对象
Random random = new Random();
3、创建不带种子的Random对象有两种方法:
1) Random random = new Random(555L);
2) Random random = new Random();random.setSeed(555L);
四、测试
通过一个例子说明上面的用法
- import java.util.Random;
- public class TestRandomNum {
- public static void main(String[] args) {
- randomTest();
- testNoSeed();
- testSeed1();
- testSeed2();
- }
- public static void randomTest() {
- System.out.println("--------------test()--------------");
- //返回以毫秒为单位的当前时间。
- long r1 = System.currentTimeMillis();
- //返回带正号的 double 值,大于或等于 0.0,小于 1.0。
- double r2 = Math.random();
- //通过Random类来获取下一个随机的整数
- int r3 = new Random().nextInt();
- System.out.println("r1 = " + r1);
- System.out.println("r3 = " + r2);
- System.out.println("r2 = " + r3);
- }
- public static void testNoSeed() {
- System.out.println("--------------testNoSeed()--------------");
- //创建不带种子的测试Random对象
- Random random = new Random();
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- public static void testSeed1() {
- System.out.println("--------------testSeed1()--------------");
- //创建带种子的测试Random对象
- Random random = new Random(555L);
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- public static void testSeed2() {
- System.out.println("--------------testSeed2()--------------");
- //创建带种子的测试Random对象
- Random random = new Random();
- random.setSeed(555L);
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- }
运行结果:
- --------------test()--------------
- r1 = 1227108626582
- r3 = 0.5324887850155043
- r2 = -368083737
- --------------testNoSeed()--------------
- 809503475
- 1585541532
- -645134204
- --------------testSeed1()--------------
- -1367481220
- 292886146
- -1462441651
- --------------testSeed2()--------------
- -1367481220
- 292886146
- -1462441651
- Process finished with exit code 0
通过testSeed1()与testSeed2()方法的结果可以看到,两个打印结果相同,因为他们种子相同,再运行一次,结果还是一样的,这就是带种子随机数的特性。
而不带种子的,每次运行结果都是随机的。
五、综合应用
下面通过最近写的一个随机数工具类来展示用法:
- import java.util.Random;
- /**
- * 随机数、随即字符串工具
- */
- public class RandomUtils {
- public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static final String numberChar = "0123456789";
- /**
- * 返回一个定长的随机字符串(只包含大小写字母、数字)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateString(int length) {
- StringBuffer sb = new StringBuffer();
- Random random = new Random();
- for (int i = 0; i < length; i++) {
- sb.append(allChar.charAt(random.nextInt(allChar.length())));
- }
- return sb.toString();
- }
- /**
- * 返回一个定长的随机纯字母字符串(只包含大小写字母)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateMixString(int length) {
- StringBuffer sb = new StringBuffer();
- Random random = new Random();
- for (int i = 0; i < length; i++) {
- sb.append(allChar.charAt(random.nextInt(letterChar.length())));
- }
- return sb.toString();
- }
- /**
- * 返回一个定长的随机纯大写字母字符串(只包含大小写字母)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateLowerString(int length) {
- return generateMixString(length).toLowerCase();
- }
- /**
- * 返回一个定长的随机纯小写字母字符串(只包含大小写字母)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateUpperString(int length) {
- return generateMixString(length).toUpperCase();
- }
- /**
- * 生成一个定长的纯0字符串
- *
- * @param length 字符串长度
- * @return 纯0字符串
- */
- public static String generateZeroString(int length) {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < length; i++) {
- sb.append('0');
- }
- return sb.toString();
- }
- /**
- * 根据数字生成一个定长的字符串,长度不够前面补0
- *
- * @param num 数字
- * @param fixdlenth 字符串长度
- * @return 定长的字符串
- */
- public static String toFixdLengthString(long num, int fixdlenth) {
- StringBuffer sb = new StringBuffer();
- String strNum = String.valueOf(num);
- if (fixdlenth - strNum.length() >= 0) {
- sb.append(generateZeroString(fixdlenth - strNum.length()));
- } else {
- throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- /**
- * 根据数字生成一个定长的字符串,长度不够前面补0
- *
- * @param num 数字
- * @param fixdlenth 字符串长度
- * @return 定长的字符串
- */
- public static String toFixdLengthString(int num, int fixdlenth) {
- StringBuffer sb = new StringBuffer();
- String strNum = String.valueOf(num);
- if (fixdlenth - strNum.length() >= 0) {
- sb.append(generateZeroString(fixdlenth - strNum.length()));
- } else {
- throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- public static void main(String[] args) {
- System.out.println(generateString(15));
- System.out.println(generateMixString(15));
- System.out.println(generateLowerString(15));
- System.out.println(generateUpperString(15));
- System.out.println(generateZeroString(15));
- System.out.println(toFixdLengthString(123, 15));
- System.out.println(toFixdLengthString(123L, 15));
- }
- }
- import java.util.Random;
- /**
- * 随机数、随即字符串工具
- */
- public class RandomUtils {
- public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static final String numberChar = "0123456789";
- /**
- * 返回一个定长的随机字符串(只包含大小写字母、数字)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateString(int length) {
- StringBuffer sb = new StringBuffer();
- Random random = new Random();
- for (int i = 0; i < length; i++) {
- sb.append(allChar.charAt(random.nextInt(allChar.length())));
- }
- return sb.toString();
- }
- /**
- * 返回一个定长的随机纯字母字符串(只包含大小写字母)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateMixString(int length) {
- StringBuffer sb = new StringBuffer();
- Random random = new Random();
- for (int i = 0; i < length; i++) {
- sb.append(allChar.charAt(random.nextInt(letterChar.length())));
- }
- return sb.toString();
- }
- /**
- * 返回一个定长的随机纯大写字母字符串(只包含大小写字母)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateLowerString(int length) {
- return generateMixString(length).toLowerCase();
- }
- /**
- * 返回一个定长的随机纯小写字母字符串(只包含大小写字母)
- *
- * @param length 随机字符串长度
- * @return 随机字符串
- */
- public static String generateUpperString(int length) {
- return generateMixString(length).toUpperCase();
- }
- /**
- * 生成一个定长的纯0字符串
- *
- * @param length 字符串长度
- * @return 纯0字符串
- */
- public static String generateZeroString(int length) {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < length; i++) {
- sb.append('0');
- }
- return sb.toString();
- }
- /**
- * 根据数字生成一个定长的字符串,长度不够前面补0
- *
- * @param num 数字
- * @param fixdlenth 字符串长度
- * @return 定长的字符串
- */
- public static String toFixdLengthString(long num, int fixdlenth) {
- StringBuffer sb = new StringBuffer();
- String strNum = String.valueOf(num);
- if (fixdlenth - strNum.length() >= 0) {
- sb.append(generateZeroString(fixdlenth - strNum.length()));
- } else {
- throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- /**
- * 根据数字生成一个定长的字符串,长度不够前面补0
- *
- * @param num 数字
- * @param fixdlenth 字符串长度
- * @return 定长的字符串
- */
- public static String toFixdLengthString(int num, int fixdlenth) {
- StringBuffer sb = new StringBuffer();
- String strNum = String.valueOf(num);
- if (fixdlenth - strNum.length() >= 0) {
- sb.append(generateZeroString(fixdlenth - strNum.length()));
- } else {
- throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- public static void main(String[] args) {
- System.out.println(generateString(15));
- System.out.println(generateMixString(15));
- System.out.println(generateLowerString(15));
- System.out.println(generateUpperString(15));
- System.out.println(generateZeroString(15));
- System.out.println(toFixdLengthString(123, 15));
- System.out.println(toFixdLengthString(123L, 15));
- }
- }
运行结果:
- vWMBPiNbzfGCpHG
- 23hyraHdJkKPwMv
- tigowetbwkm1nde
- BPZ1KNEJPHB115N
- 000000000000000
- 000000000000123
- 000000000000123
- Process finished with exit code 0
java产生随机数的三种方式的更多相关文章
- Java生成随机数的三种方式
package cn.zytao.taosir.random; import java.util.Random; public class RandomDemo { private static In ...
- java产生随机数的几种方式
java产生随机数的几种方式 一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他 ...
- java 获取随机数的三种方法
方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...
- java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...
- 如何实现有返回值的多线程 JAVA多线程实现的三种方式
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...
- Java实现线程的三种方式和区别
Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...
- [OpenSource]浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...
- 浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...
- Java并发编程:Java创建线程的三种方式
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
随机推荐
- 【codeforces 538E】Demiurges Play Again
[题目链接]:http://codeforces.com/problemset/problem/538/E [题意] 给你一棵树; 有两个人,分别从根节点开始,往叶子节点的方向走; 每个人每次只能走一 ...
- No WebApplicationContext found: no ContextLoaderListener registered?报错解决
今天跑了下新搭的一个SSI框架. 报例如以下错误: 严重: Exception sending context initialized event to listener instance of cl ...
- C语言函数--E
函数名: ecvt 功 能: 把一个浮点数转换为字符串 用 法: char ecvt(double value, int ndigit, int *decpt, int *sign); 程序例: #i ...
- C++里面关于虚函数的一些注意点
最后,总结一下关于虚函数的一些常见问题: 1) 虚函数是动态绑定的,也就是说,使用虚函数的指针和引用能够正确找到实际类的对应函数,而不是执行定义类的函数.这是虚函数的基本功能,就不再解释了. 2) 构 ...
- hadoop云盘client的设计与实现(一)
近期在hadoop云盘client项目.在做这个项目曾经对hadoop是一点都不了解呀,在网上查了好久.将client开发的是非常少的,在做这个项目的过程中遇到非常多奇葩的问题. 并且试图换过好多方案 ...
- 2015上海网络赛 HDU 5478 Can you find it 数学
HDU 5478 Can you find it 题意略. 思路:先求出n = 1 时候满足条件的(a,b), 最多只有20W对,然后对每一对进行循环节判断即可 #include <iostre ...
- ImportError: cannot import name pxssh
Traceback (most recent call last): File "/root/Desktop/JuniperBackdoor-master/JuniperBackdoor.p ...
- python 深浅拷贝小记
浅拷贝:只拷贝第一层的数据 深拷贝:相当于克隆 一份,也就是完全复制,和被克隆对象完全没关系. 浅拷贝示例:先定义一个列表 >>> s = [1,'alex','alvin'] &g ...
- 使用IntelliJ IDEA开发前的基本设置,有助于提高开发效率
2.界面字体大小设置 File菜单->Settings->Appearance->Override default fonts by(not recommended): Name:宋 ...
- Maven实战(八)---模块划分
为了防止传递依赖,我们各个模块之间尽量用直接依赖的方式.本篇文章介绍多模块化开发.我们做过Maven项目的都知道.我们的项目一般都是分模块的,每一个模块都会相应着一个POM.xml文件,它们之间通过继 ...