Java生成随机整数

在 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,让学习成为一种享受

Java项目:

【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

猜你喜欢

转载自juejin.im/post/7094564078890254350