在 Java 中,生成随机数的场景有很多,所以本文我们就来盘点一下 几种生成随机数的方式,以及它们之间的区别和每种生成方式所对应的场景。
1. java.util.Random
这Random().nextInt(int bound)会生成一个从 0(包括)到 bound(不包括)的随机整数。
(1)代码片段
对于getRandomNumberInRange(5, 10),这将生成一个介于 5(含)和 10(含)之间的随机整数。
private static int getRandomNumberInRange(int min, int max) {
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
复制代码
(2)什么是 (max – min) + 1) + min?
上面的公式将生成一个介于 min(含)和 max(含)之间的随机整数。
//Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive)
//1. nextInt(range) = nextInt(max - min)
new Random().nextInt(5); // [0...4] [min = 0, max = 4]
new Random().nextInt(6); // [0...5]
new Random().nextInt(7); // [0...6]
new Random().nextInt(8); // [0...7]
new Random().nextInt(9); // [0...8]
new Random().nextInt(10); // [0...9]
new Random().nextInt(11); // [0...10]
//2. To include the last value (max value) = (range + 1)
new Random().nextInt(5 + 1) // [0...5] [min = 0, max = 5]
new Random().nextInt(6 + 1) // [0...6]
new Random().nextInt(7 + 1) // [0...7]
new Random().nextInt(8 + 1) // [0...8]
new Random().nextInt(9 + 1) // [0...9]
new Random().nextInt(10 + 1) // [0...10]
new Random().nextInt(11 + 1) // [0...11]
//3. To define a start value (min value) in a range,
// For example, the range should start from 10 = (range + 1) + min
new Random().nextInt(5 + 1) + 10 // [0...5] + 10 = [10...15]
new Random().nextInt(6 + 1) + 10 // [0...6] + 10 = [10...16]
new Random().nextInt(7 + 1) + 10 // [0...7] + 10 = [10...17]
new Random().nextInt(8 + 1) + 10 // [0...8] + 10 = [10...18]
new Random().nextInt(9 + 1) + 10 // [0...9] + 10 = [10...19]
new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20]
new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21]
// Range = (max - min)
// So, the final formula is ((max - min) + 1) + min
//4. Test [10...30]
// min = 10 , max = 30, range = (max - min)
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((30 - 10) + 1) + 10
new Random().nextInt((20) + 1) + 10
new Random().nextInt(21) + 10 //[0...20] + 10 = [10...30]
//5. Test [15...99]
// min = 15 , max = 99, range = (max - min)
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((99 - 15) + 1) + 15
new Random().nextInt((84) + 1) + 15
new Random().nextInt(85) + 15 //[0...84] + 15 = [15...99]
//Done, understand?
复制代码
(3)生成 10 个随机整数的完整示例,范围在 5(含)和 10(含)之间。
package com.mkyong.example.test;
import java.util.Random;
public class TestRandom {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getRandomNumberInRange(5, 10));
}
}
private static int getRandomNumberInRange(int min, int max) {
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
}
复制代码
输出
7
6
10
8
9
5
7
10
8
5
复制代码
2. 数学.随机
这Math.random()给出了一个从 0.0(包括)到 1.0(不包括)的随机双精度值。
(1)代码片段。参考1.2,或多或少是相同的公式。
(int)(Math.random() * ((max - min) + 1)) + min
复制代码
(2)生成16(含)到20(含)范围内的10个随机整数的完整示例。
package com.mkyong.example.test;
public class TestRandom {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getRandomNumberInRange(16, 20));
}
}
private static int getRandomNumberInRange(int min, int max) {
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
return (int)(Math.random() * ((max - min) + 1)) + min;
}
}
复制代码
输出
17
16
20
19
20
20
20
17
20
16
复制代码
3.Java 8 Random.ints
在 Java 8 中,添加了新方法java.util.Random
public IntStream ints(int randomNumberOrigin, int randomNumberBound)
public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
复制代码
这Random.ints(int origin, int bound)或Random.ints(int min, int max)生成一个从原点(包括)到绑定(不包括)的随机整数。
(1)代码片段。
private static int getRandomNumberInRange(int min, int max) {
Random r = new Random();
return r.ints(min, (max + 1)).findFirst().getAsInt();
}
复制代码
(2)生成 33(含)到 38(含)范围内的 10 个随机整数的完整示例。
package com.mkyong.form.test;
import java.util.Random;
public class TestRandom {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getRandomNumberInRange(33, 38));
}
}
private static int getRandomNumberInRange(int min, int max) {
Random r = new Random();
return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt();
}
}
复制代码
输出
34
35
37
33
38
37
34
35
36
37
复制代码
(3)额外,供自己参考。
生成范围在 33(含)和 38(不含)之间的随机整数,流大小为 10。并打印出带有forEach.
//Java 8 only
new Random().ints(10, 33, 38).forEach(System.out::println);
复制代码
输出
34
37
37
34
34
35
36
33
37
34
复制代码
Java学习视频
Java基础:
Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受