Java 8提供了4种生成随机数的方法,如下所示:

  1. java.util.Random class
  2. Math.random method : Can Generate Random Numbers of double type.
  3. ThreadLocalRandom class
  4. 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)相关推荐

  1. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

    Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...

  2. 随机数产生器(random number generator)

    随机数产生器 随机数产生器一般分为真正的随机和伪随机(pseudorandom number generator (PRNG)).真正的随机则是不可预测的:伪随机则依靠随机数种子和随机算法,是可能被预 ...

  3. C++11中随机数生成器(random)

    目录 1 随机数生成器的分类 2 随机数据引擎 2.1 线性同余法引擎 2.2 梅森旋转法引擎 2.3 滞后Fibonacci引擎 2.4 非确定随机生成器 2.5 默认随机数引擎 3 随机数适配器 ...

  4. 随机数字生成器(Random Number Generation)看这一篇就够了!

    伪随机数 作为utils包的一部分,Java提供了一个基本的伪随机数生成器,适当地命名为random.该对象可用于生成任意内置数字数据类型(int.float等)的伪随机值.您也可以使用它来生成一个随 ...

  5. 第十五届吉林省赛The 15th Jilin Provincial Collegiate Programming Contest C.Random Number Generator(数学 BSGS)

    文章目录 题意 题解 代码 总结 题目链接 题意 : 题解 : BSGS 代码 : #include <bits/stdc++.h> #include <unordered_map& ...

  6. 随机数生成器 java_Java中的随机数生成器

    随机数生成器 java Today we will look at how to generate a random number in Java. Sometimes we need to gene ...

  7. Java 随机数生成器 Random SecureRandom 原理分析

    文章目录 java.util.Random java.Security.SecureRandom /dev/random 与 /dev/urandom 资料 Java 里提供了一些用于生成随机数的工具 ...

  8. Java 随机数生成器 Random SecureRandom

    Java 里提供了一些用于生成随机数的工具类,这里分析一下其实现原理,以及他们之间的区别.使用场景. java.util.Random Random 是比较常用的随机数生成类,它的基本信息在类的注释里 ...

  9. 试试 intel rng 随机数生成器

    今天看蒙特卡罗方法,看到对随机数的质量蛮强调的,搜索了一下随机数生成器,注意到intel的 drng,下载了guide 跟着实验了一下. Bull Mountain Software Implemen ...

  10. Java 中Random类随机数生成器

    *随机数生成器Random类  *   * public Random()产生一个随机数生成器  * public Random(long seed):创建随机数生成器的同时,给固定时间值  *    ...

最新文章

  1. hystrix 源码 线程池隔离_基于hystrix的线程池隔离
  2. 《精通Windows API-函数、接口、编程实例》——第4章文件系统
  3. vim 的tabnew带来的惊喜-建立多标签
  4. Electron项目怎样打包成桌面exe应用
  5. linux 文件及目录结构体系
  6. excluded by a filter_A. Manthiram:碲入硫,锂更稳!
  7. html隐藏层点击显示不出来,[js+css]点击隐藏层,点击另外层不能隐藏原层
  8. LeetCode 360. 有序转化数组(抛物线对称轴)
  9. php人物行走,非常震撼的纯CSS3人物行走动画
  10. linux 父子进程结束,Linux下让父进程结束后,子进程自动结束
  11. 10-Mybatis 多表查询之多对多
  12. QTableWidget插入项item方法 及误区
  13. 查找文章中出现频率最高的单词
  14. (node:62099) ExperimentalWarning: The fs.promises API is experimental
  15. IDEA中自动导包及快捷键
  16. 计算机信息安全技术 学习笔记
  17. 黑页网站html源码,仿360网站卫士拦截页面黑页源码
  18. 支付宝小程序中使用阿里字体图标
  19. dma循环刷新oled屏幕
  20. PLC通讯实现-C#实现AB5000 PLC以太网通讯DTL32(八)

热门文章

  1. Metasploit为什么选择Ruby语言(部分)
  2. 情感计算机具体应用领域,人工智能-情感计算
  3. 2020ICPC上海站 E题 The Journey of Geor Autumn 组合数学 + dp
  4. “四大神兽”拆机指北
  5. Web开发分享qq、微信组件-百度分享
  6. javascript实现图片轮播_Node.js实现将文字与图片合成技巧
  7. oracle羊毛,预言机(Oracle)简介和撸羊毛教程— 上篇
  8. 360极速浏览器的兼容模式
  9. java 均值方差 计算器_方差均值计算器
  10. 【每日一练:逻辑题】使用一个天平找8个球中其中一个重量不一致的球