随机数生成器(RNG, random number generator)
Java 8提供了4种生成随机数的方法,如下所示:
- java.util.Random class
- Math.random method : Can Generate Random Numbers of double type.
- ThreadLocalRandom class
- java.Security.SecureRandom
1) java.util.Random
Random使用的算法是linear congruential generator (LCG 线性同余发生器).
要使用此类生成随机数,我们必须首先创建此类的实例,然后使用该实例调用 nextInt()、nextDouble()、nextLong() 等方法。
我们可以使用这个类生成整数、浮点数、双精度数、长整数、布尔值类型的随机数。
我们可以将参数传递给在要生成的数字范围上设置上限的方法。 例如,nextInt(6) 将生成 0 到 5 范围内的数字,包括两者。
// A Java program to demonstrate random number generation
// using java.util.Random;
import java.util.Random;public class generateRandom{public static void main(String args[]){// create instance of Random classRandom rand = new Random();// Generate random integers in range 0 to 999int rand_int1 = rand.nextInt(1000);int rand_int2 = rand.nextInt(1000);// Print random integersSystem.out.println("Random Integers: "+rand_int1);System.out.println("Random Integers: "+rand_int2);// Generate Random doublesdouble rand_dub1 = rand.nextDouble();double rand_dub2 = rand.nextDouble();// Print random doublesSystem.out.println("Random Doubles: "+rand_dub1);System.out.println("Random Doubles: "+rand_dub2);}
}
Random Integers: 547
Random Integers: 126
Random Doubles: 0.8369779739988428
Random Doubles: 0.5497554388209912
2) Math.random()
类 Math 包含各种数值运算的方法,例如计算幂、对数等。其中一种方法是 random(),该方法返回一个双精度值,带正号,大于或等于 0.0 且小于 1.0 . 返回值是伪随机选择的。 此方法只能生成 Doubles 类型的随机数。 下面的程序解释了如何使用这种方法:
// Java program to demonstrate working of
// Math.random() to generate random numbers
import java.util.*;public class generateRandom
{public static void main(String args[]){// Generating random doublesSystem.out.println("Random doubles: " + Math.random());System.out.println("Random doubles: " + Math.random());}
}
Random doubles: 0.13077348615666562
Random doubles: 0.09247016928442775
3) java.util.concurrent.ThreadLocalRandom class
这个类是在 java 1.7 中引入的,用于生成整数、双精度、布尔值等类型的随机数。 下面的程序解释了如何使用这个类来生成随机数
// Java program to demonstrate working of ThreadLocalRandom
// to generate random numbers.
import java.util.concurrent.ThreadLocalRandom;public class generateRandom
{public static void main(String args[]){// Generate random integers in range 0 to 999int rand_int1 = ThreadLocalRandom.current().nextInt();int rand_int2 = ThreadLocalRandom.current().nextInt();// Print random integersSystem.out.println("Random Integers: " + rand_int1);System.out.println("Random Integers: " + rand_int2);// Generate Random doublesdouble rand_dub1 = ThreadLocalRandom.current().nextDouble();double rand_dub2 = ThreadLocalRandom.current().nextDouble();// Print random doublesSystem.out.println("Random Doubles: " + rand_dub1);System.out.println("Random Doubles: " + rand_dub2);// Generate random booleansboolean rand_bool1 = ThreadLocalRandom.current().nextBoolean();boolean rand_bool2 = ThreadLocalRandom.current().nextBoolean();// Print random BooleansSystem.out.println("Random Booleans: " + rand_bool1);System.out.println("Random Booleans: " + rand_bool2);}
}
Random Integers: 536953314
Random Integers: 25905330
Random Doubles: 0.7504989954390163
Random Doubles: 0.7658597196204409
Random Booleans: false
Random Booleans: true
4)java.Security.SecureRandom
SecureRandom默认的算法是SHA1PRNG.此类提供加密强随机数生成器 ----cryptographically secure PRNG (CSPRNG)。
SecureRandom random1 = new SecureRandom();
SecureRandom random2 = SecureRandom.getInstance("SHA1PRNG");
for (int i = 0; i < 5; i++) {System.out.println(random1.nextInt() + " != " + random2.nextInt());
}
704046703 != 2117229935
60819811 != 107252259
425075610 != -295395347
682299589 != -1637998900
-1147654329 != 1418666937
性能比较:
SecureRandom比Random要慢1个数量级.
@Testpublic void performanceCompare(){final long start = System.currentTimeMillis();randomInt(new Random());System.out.println("cost:" + (System.currentTimeMillis() - start) + "ms");final long start2 = System.currentTimeMillis();randomInt(new SecureRandom());System.out.println("cost:" + (System.currentTimeMillis() - start2) + "ms");}public void randomInt(Random r){final HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < 100000; i++) {final int val = r.nextInt(10);final Integer count = map.get(val);if(count == null){map.put(val, 0);}else{map.put(val, count + 1);}try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}map.forEach((k,v)-> System.out.println(k+"-->"+v));}
0–>9968
1–>10008
2–>10003
3–>9862
4–>9975
5–>10044
6–>10247
7–>9925
8–>10001
9–>9957
cost:602079ms
0–>10150
1–>10001
2–>9960
3–>9789
4–>9973
5–>9946
6–>9958
7–>10100
8–>10024
9–>10089
cost:5024065ms
参考:
Generating random numbers in Java: https://www.geeksforgeeks.org/generating-random-numbers-in-java/
Java 生成随机数的 5 种方式,你知道几种:https://segmentfault.com/a/1190000038405773
官方文档: https://docs.oracle.com/javase/8/docs/api/java/util/Random.html
https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html
维基百科
https://en.wikipedia.org/wiki/Pseudorandom_number_generator
https://en.wikipedia.org/wiki/Linear_congruential_generator
随机数生成器(RNG, random number generator)相关推荐
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...
- 随机数产生器(random number generator)
随机数产生器 随机数产生器一般分为真正的随机和伪随机(pseudorandom number generator (PRNG)).真正的随机则是不可预测的:伪随机则依靠随机数种子和随机算法,是可能被预 ...
- C++11中随机数生成器(random)
目录 1 随机数生成器的分类 2 随机数据引擎 2.1 线性同余法引擎 2.2 梅森旋转法引擎 2.3 滞后Fibonacci引擎 2.4 非确定随机生成器 2.5 默认随机数引擎 3 随机数适配器 ...
- 随机数字生成器(Random Number Generation)看这一篇就够了!
伪随机数 作为utils包的一部分,Java提供了一个基本的伪随机数生成器,适当地命名为random.该对象可用于生成任意内置数字数据类型(int.float等)的伪随机值.您也可以使用它来生成一个随 ...
- 第十五届吉林省赛The 15th Jilin Provincial Collegiate Programming Contest C.Random Number Generator(数学 BSGS)
文章目录 题意 题解 代码 总结 题目链接 题意 : 题解 : BSGS 代码 : #include <bits/stdc++.h> #include <unordered_map& ...
- 随机数生成器 java_Java中的随机数生成器
随机数生成器 java Today we will look at how to generate a random number in Java. Sometimes we need to gene ...
- Java 随机数生成器 Random SecureRandom 原理分析
文章目录 java.util.Random java.Security.SecureRandom /dev/random 与 /dev/urandom 资料 Java 里提供了一些用于生成随机数的工具 ...
- Java 随机数生成器 Random SecureRandom
Java 里提供了一些用于生成随机数的工具类,这里分析一下其实现原理,以及他们之间的区别.使用场景. java.util.Random Random 是比较常用的随机数生成类,它的基本信息在类的注释里 ...
- 试试 intel rng 随机数生成器
今天看蒙特卡罗方法,看到对随机数的质量蛮强调的,搜索了一下随机数生成器,注意到intel的 drng,下载了guide 跟着实验了一下. Bull Mountain Software Implemen ...
- Java 中Random类随机数生成器
*随机数生成器Random类 * * public Random()产生一个随机数生成器 * public Random(long seed):创建随机数生成器的同时,给固定时间值 * ...
最新文章
- hystrix 源码 线程池隔离_基于hystrix的线程池隔离
- 《精通Windows API-函数、接口、编程实例》——第4章文件系统
- vim 的tabnew带来的惊喜-建立多标签
- Electron项目怎样打包成桌面exe应用
- linux 文件及目录结构体系
- excluded by a filter_A. Manthiram:碲入硫,锂更稳!
- html隐藏层点击显示不出来,[js+css]点击隐藏层,点击另外层不能隐藏原层
- LeetCode 360. 有序转化数组(抛物线对称轴)
- php人物行走,非常震撼的纯CSS3人物行走动画
- linux 父子进程结束,Linux下让父进程结束后,子进程自动结束
- 10-Mybatis 多表查询之多对多
- QTableWidget插入项item方法 及误区
- 查找文章中出现频率最高的单词
- (node:62099) ExperimentalWarning: The fs.promises API is experimental
- IDEA中自动导包及快捷键
- 计算机信息安全技术 学习笔记
- 黑页网站html源码,仿360网站卫士拦截页面黑页源码
- 支付宝小程序中使用阿里字体图标
- dma循环刷新oled屏幕
- PLC通讯实现-C#实现AB5000 PLC以太网通讯DTL32(八)
热门文章
- Metasploit为什么选择Ruby语言(部分)
- 情感计算机具体应用领域,人工智能-情感计算
- 2020ICPC上海站 E题 The Journey of Geor Autumn 组合数学 + dp
- “四大神兽”拆机指北
- Web开发分享qq、微信组件-百度分享
- javascript实现图片轮播_Node.js实现将文字与图片合成技巧
- oracle羊毛,预言机(Oracle)简介和撸羊毛教程— 上篇
- 360极速浏览器的兼容模式
- java 均值方差 计算器_方差均值计算器
- 【每日一练:逻辑题】使用一个天平找8个球中其中一个重量不一致的球