日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

随机数生成器(RNG, random number generator)

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机数生成器(RNG, random number generator) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java 8提供了4種生成隨機(jī)數(shù)的方法,如下所示:

  • 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 線性同余發(fā)生器).
    要使用此類生成隨機(jī)數(shù),我們必須首先創(chuàng)建此類的實(shí)例,然后使用該實(shí)例調(diào)用 nextInt()、nextDouble()、nextLong() 等方法。
    我們可以使用這個(gè)類生成整數(shù)、浮點(diǎn)數(shù)、雙精度數(shù)、長(zhǎng)整數(shù)、布爾值類型的隨機(jī)數(shù)。
    我們可以將參數(shù)傳遞給在要生成的數(shù)字范圍上設(shè)置上限的方法。 例如,nextInt(6) 將生成 0 到 5 范圍內(nèi)的數(shù)字,包括兩者。

    // 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 包含各種數(shù)值運(yùn)算的方法,例如計(jì)算冪、對(duì)數(shù)等。其中一種方法是 random(),該方法返回一個(gè)雙精度值,帶正號(hào),大于或等于 0.0 且小于 1.0 . 返回值是偽隨機(jī)選擇的。 此方法只能生成 Doubles 類型的隨機(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è)類是在 java 1.7 中引入的,用于生成整數(shù)、雙精度、布爾值等類型的隨機(jī)數(shù)。 下面的程序解釋了如何使用這個(gè)類來(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.此類提供加密強(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。