java 生成随机数_Java 生成随机数的 N 种方法
原標題:Java 生成隨機數的 N 種方法
www.baeldung.com/java-generating-random-numbers
1.引言
本文將探討用 Java 生成隨機數的不同方法。
2.Java API
Java API 提供了幾種隨機數生成方法。讓我們一起來了解一下。
2.1.java.lang.Math
Math 類中的 random 方法返回一個 [0.0, 1.0) 區間的 double 值。下面這段代碼能得到一個 min 和 max 之間的隨機數:
intrandomWithMathRandom = ( int) ((Math.random * (max - min)) + min);
2.2.java.util.Random
Java 1.7 之前,最流行的隨機數生成方法是 nextInt。這個方法提供了帶參數和無參數兩個版本。不帶參數調用時,nextInt 會以近似相等概率返回任意 int 值,因此很可能會得到負數:
Random random = newRandom;
intrandomWithNextInt = random.nextInt;
如果調用 netxInt 時帶上 bound 參數,將得到預期區間內的隨機數:
intrandomWintNextIntWithinARange = random.nextInt(max - min) + min;
上面的代碼段能得到一個 [0, bound) 范圍內的隨機數。因此 bound 參數必須大于0。否則會拋出 java.lang.IllegalArgumentException 異常。
Java 8 引入了新的 ints 方法,返回一個java.util.stream.IntStream,讓我們看看如何使用。
不帶參數的 ints方法將返回一個無限 int 流:
IntStream unlimitedIntStream = random.ints;
調用時還可以指定參數來限制流大小:
IntStream limitedIntStream = random.ints(streamSize);
當然,也可以為生成數值設置最大值和最小值:
IntStream limitedIntStreamWithinARange = random.ints(streamSize, min, max);
2.3.java.util.concurrent.ThreadLocalRandom
Java 1.7 中ThreadLocalRandom類提供了一種新的更高效的隨機數生成方法。與 Random 類相比有三個重要區別:
無需顯式初始化 ThreadLocalRandom 實例。這樣可以避免創建大量無用的實例,浪費垃圾收集器回收時間。
不能為 ThreadLocalRandom 設置隨機種子(seed),這可能會導致問題。如果需要設置隨機種子,應該避免采用這種方式生成隨機數。
Random 類在多線程時表現不佳。
下面讓我們看看如何使用:
intrandomWithThreadLocalRandomInARange = ThreadLocalRandom.current.nextInt(min, max);
Java 8 及更高版本提供了幾種新方法。首先,nextInt 方法有兩個變體:
intrandomWithThreadLocalRandom = ThreadLocalRandom.current.nextInt;
intrandomWithThreadLocalRandomFromZero = ThreadLocalRandom.current.nextInt(max);
其次,還可以使用 ints 方法:
IntStream streamWithThreadLocalRandom = ThreadLocalRandom.current.ints;
2.4.java.util.SplittableRandom
Java 8 還帶來了一個快速隨機數生成器SplittableRandom類。
正如 JavaDoc 中描述的那樣,這是一個支持并行計算的隨機數生成器。值得注意的是,這個實例非線程安全。使用該類時需要當心。
現在有了 nextInt 和 ints 方法。調用 nextInt 時,可以通過參數指定 top 和 bottom 范圍:
SplittableRandom splittableRandom = newSplittableRandom;
intrandomWithSplittableRandom = splittableRandom.nextInt(min, max);
這樣可以檢查 max 參數是否大于 min。檢查失敗會收到一個到IllegalArgumentException。但是,這里不會進行正數或負數檢查。因此,參數可以填寫負數。也可以在調用時使用一個參數或者不使用參數。工作方式與之前描述的相同。
這里也提供了ints方法。這意味著可以輕松得到 int流。可以選擇流數據個數有限或無限。對于有限流,可以為數字生成范圍設置 top 和 bottom:
IntStream limitedIntStreamWithinARangeWithSplittableRandom = splittableRandom.ints(streamSize, min, max);
2.5.java.security.SecureRandom
如果應用程序對安全敏感,則應考慮使用SecureRandom。這是一個強加密隨機數生成器。實例默認構造函數不使用隨機種子。因此,我們應該:
設置隨機種子:隨機種子不可預測
設置 java.util.secureRandomSeed 系統屬性為 true。
該類繼承自java.util.Random。現在,我們介紹了上面各種隨機數生成方法。例如,如果需要獲取任意 int 值,調用 nextInt 時可以不帶參數:
SecureRandom secureRandom = newSecureRandom;
intrandomWithSecureRandom = secureRandom.nextInt;
如果需要設置隨機數生成范圍,則可以在調用時帶 bound 參數:
intrandomWithSecureRandomWithinARange = secureRandom.nextInt(max - min) + min;
切記,如果參數小于零會拋出 IllegalArgumentException。
3.第三方 API
上文的介紹中,Java 提供了許多隨機數生成類和方法。然而,也有很多第三方 API 可以生成隨機數。
下面對其中的一些進行介紹。
3.1.org.apache.commons.math3.random.RandomDataGenerator
Apache Commons 項目中 Commons 數學庫提供了很多生成器。最簡單,也可能最有用的是 RandomDataGenerator。它使用 Well19937c 算法生成隨機數。我們也可以自行提供隨機數算法。
讓我們看看如何使用。首先,添加依賴項:
org.apache.commons
commons-math3
3.6.1
最新版本的 commons-math3 可以在 Maven Central 中找到。
然后開始使用:
RandomDataGenerator randomDataGenerator = newRandomDataGenerator;
intrandomWithRandomDataGenerator = randomDataGenerator.nextInt(min, max);
3.2.it.unimi.dsi.util.XoRoShiRo128PlusRandom
這是最快的隨機數生成器之一。由米蘭大學信息科學系開發。
也可以在 Maven Central 倉庫中找到。首先,添加依賴項:
it.unimi.dsi
dsiutils
2.6.0
該生成器繼承了 java.util.Random 類。但是,如果仔細看一下 JavaDoc,就會發現只有一種調用方法——通過 nextInt 生成隨機數。最重要的是,該方法只提供無參和單個參數兩種版本。其他任何調用都將直接調用 java.util.Random 方法。
例如,如果想得到某個范圍內的隨機數,可以這樣寫:
XoRoShiRo128PlusRandom xoroRandom = newXoRoShiRo128PlusRandom;
intrandomWithXoRoShiRo128PlusRandom = xoroRandom.nextInt(max - min) + min;
4.總結
生成隨機數有很多辦法,但沒有最佳方法。因此,應當根據需求選擇最合適的方法。
本文的完整示例可以在 GitHub 上下載。
github.com/eugenp/tutorials/tree/master/java-numbers-3返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的java 生成随机数_Java 生成随机数的 N 种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud 入门教程(八):
- 下一篇: 逻辑回归的总结(详细步骤)