在 Java 中,產生隨機值的方法有好幾種。
Random
java.util.Random類別提供了幾種產生偽隨機值的方法。
Random random = new Random();
random.next(8); // Generates a random int with the given number of bits, in this case 8
random.nextInt(); // Generates a random int in the range Integer.MIN_VALUE through Integer.MAX_VALUE
random.nextInt(10); // Generates a random int in the range 0 to 10
random.nextFloat(); // Generates a random float in the range 0.0 to 1.0
random.nextDouble(); // Generates a random double in the range 0.0 to 1.0
random.nextBoolean(); // Generates a random boolean value
random.nextLong(); // Generates a random long value
除了預設建構子之外,Random 類別還有另一個建構子,可以自訂種子。
如果用相同的種子建立兩個 Random 實例,並對它們進行相同順序的方法呼叫,它們就會產生並回傳完全相同的數字序列。
Math.random()
Math.random()方法是一個工具方法,用來產生介於0.0到1.0之間的隨機Double。
ThreadLocalRandom
java.util.concurrent.ThreadLocalRandom類別是java.util.Random的替代方案,而且設計成執行緒安全。
這個類別有一些額外的工具方法,可以同時指定下界與上界來產生值,用起來稍微方便一些。
ThreadLocalRandom random = ThreadLocalRandom.current();
random.nextInt(10, 20); // Generates a random int in the range 10 to 20
random.nextLong(10, 20); // Generates a random long in the range 10 to 20
random.nextFloat(10.0, 20.0); // Generates a random float in the range 10 to 20
random.nextDouble(10.0, 20.0); // Generates a random double in the range 10 to 20
隨機值常被用來產生密碼之類的敏感值。 然而,上述所有產生隨機值的方法都_不_被視為密碼學上安全。
如要產生密碼學上夠強的隨機數字,請使用java.security.SecureRandom類別。