在Java中生成随机数的场景有很多,下面这篇文章主要给大家介绍了关于Java生成范围内随机整数的三种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
前言
在本文中,我们将向您展示三种生成范围内随机整数的方法。
- java.util.Random.nextInt
- 数学随机
- java.util.Random.ints(Java 8)
1. java.util.Random
此Random().nextInt(int bound)生成一个从0(含)到bound( Random().nextInt(int bound)的随机整数。
1.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;
}
1.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?
1.3完整示例生成10个随机整数,范围在5(含)和10(含)之间。
TestRandom.java
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( Math.random()的随机双Math.random() 。
2.1代码段。 参考1.2,或多或少是相同的公式。
(int)(Math.random() * ((max - min) + 1)) + min
2.2完整示例生成10个随机整数,范围在16(含)和20(含)之间。
TestRandom.java
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
注意
请阅读Oracle论坛帖子 , Random.nextInt(n)比Math.random() * n更有效。
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)生成一个从原点(包含)到bound(不包含)的随机整数。
3.1代码段。
private static int getRandomNumberInRange(int min, int max) {
Random r = new Random();
return r.ints(min, (max + 1)).findFirst().getAsInt();
}
3.2完整示例生成10个随机整数,范围在33(含)和38(含)之间。
TestRandom.java
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.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.util.Random JavaDoc
- java.lang.Math JavaDoc
- Oracle论坛:随机数生成
- 在JavaScript中生成加权随机数
翻译自: https://mkyong.com/java/java-generate-random-integers-in-a-range/
总结
到此这篇关于Java生成范围内随机整数的三种方法的文章就介绍到这了,更多相关Java生成随机整数内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Java生成范围内随机整数的三种方法
基础教程推荐
- Java实现线程插队的示例代码 2022-09-03
- java实现多人聊天系统 2023-05-19
- java基础知识之FileInputStream流的使用 2023-08-11
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java文件管理操作的知识点整理 2023-05-19
- Java实现查找文件和替换文件内容 2023-04-06
- Java数据结构之对象比较详解 2023-03-07
- springboot自定义starter方法及注解实例 2023-03-31
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java并发编程进阶之线程控制篇 2023-03-07