随机数生成器(RNG, random number generator)
Java 8提供了4種生成隨機(jī)數(shù)的方法,如下所示:
1) java.util.Random
Random使用的算法是linear congruential generator (LCG 線性同余發(fā)生器).
要使用此類(lèi)生成隨機(jī)數(shù),我們必須首先創(chuàng)建此類(lèi)的實(shí)例,然后使用該實(shí)例調(diào)用 nextInt()、nextDouble()、nextLong() 等方法。
我們可以使用這個(gè)類(lèi)生成整數(shù)、浮點(diǎn)數(shù)、雙精度數(shù)、長(zhǎng)整數(shù)、布爾值類(lèi)型的隨機(jī)數(shù)。
我們可以將參數(shù)傳遞給在要生成的數(shù)字范圍上設(shè)置上限的方法。 例如,nextInt(6) 將生成 0 到 5 范圍內(nèi)的數(shù)字,包括兩者。
Random Integers: 547
Random Integers: 126
Random Doubles: 0.8369779739988428
Random Doubles: 0.5497554388209912
2) Math.random()
類(lèi) Math 包含各種數(shù)值運(yùn)算的方法,例如計(jì)算冪、對(duì)數(shù)等。其中一種方法是 random(),該方法返回一個(gè)雙精度值,帶正號(hào),大于或等于 0.0 且小于 1.0 . 返回值是偽隨機(jī)選擇的。 此方法只能生成 Doubles 類(lèi)型的隨機(jī)數(shù)。 下面的程序解釋了如何使用這種方法:
// 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
這個(gè)類(lèi)是在 java 1.7 中引入的,用于生成整數(shù)、雙精度、布爾值等類(lèi)型的隨機(jī)數(shù)。 下面的程序解釋了如何使用這個(gè)類(lèi)來(lái)生成隨機(jī)數(shù)
// 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默認(rèn)的算法是SHA1PRNG.此類(lèi)提供加密強(qiáng)隨機(jī)數(shù)生成器 ----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個(gè)數(shù)量級(jí).
@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 生成隨機(jī)數(shù)的 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
總結(jié)
以上是生活随笔為你收集整理的随机数生成器(RNG, random number generator)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何开发亲戚计算器
- 下一篇: 18个提高效率的办公软件推荐,收好不谢