ソースを参照

fix NumberUtil

Looly 5 年 前
コミット
03e45bc514

+ 1 - 0
CHANGELOG.md

@@ -13,6 +13,7 @@
 * 【core   】     ArrayUtil.indexOf修改double的equals判断(pr#1147@Github)
 * 【core   】     优化StrUtil中部分参数校验以及逻辑处理(pr#1144@Github)
 * 【core   】     简化CreditCode逻辑去除无用Character.toUpperCase(pr#1145@Github)
+* 【core   】     NumberUtil增加generateRandomNumber重载,可自定义seed(issue#I1XTUT@Gitee)
 
 ### Bug修复
 * 【core   】     解决农历判断节日未判断大小月导致的问题(issue#I1XHSF@Gitee)

+ 20 - 11
hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java

@@ -1272,27 +1272,36 @@ public class NumberUtil {
 	 * @return 随机int数组
 	 */
 	public static int[] generateRandomNumber(int begin, int end, int size) {
+		// 种子你可以随意生成,但不能重复
+		final int[] seed = ArrayUtil.range(begin, end);
+		return generateRandomNumber(begin, end, size, seed);
+	}
+
+	/**
+	 * 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组
+	 *
+	 * @param begin 最小数字(包含该数)
+	 * @param end   最大数字(不包含该数)
+	 * @param size  指定产生随机数的个数
+	 * @param seed 种子,用于取随机数的int池
+	 * @return 随机int数组
+	 * @since 5.4.5
+	 */
+	public static int[] generateRandomNumber(int begin, int end, int size, int[] seed) {
 		if (begin > end) {
 			int temp = begin;
 			begin = end;
 			end = temp;
 		}
 		// 加入逻辑判断,确保begin<end并且size不能大于该表示范围
-		if ((end - begin) < size) {
-			throw new UtilException("Size is larger than range between begin and end!");
-		}
-		// 种子你可以随意生成,但不能重复
-		int[] seed = new int[end - begin];
+		Assert.isTrue((end - begin) > size, "Size is larger than range between begin and end!");
+		Assert.isTrue(seed.length > size, "Size is larger than seed size!");
 
-		for (int i = begin; i < end; i++) {
-			seed[i - begin] = i;
-		}
-		int[] ranArr = new int[size];
-		Random ran = new Random();
+		final int[] ranArr = new int[size];
 		// 数量你可以自己定义。
 		for (int i = 0; i < size; i++) {
 			// 得到一个位置
-			int j = ran.nextInt(seed.length - i);
+			int j = RandomUtil.randomInt(seed.length - i);
 			// 得到那个位置的数值
 			ranArr[i] = seed[j];
 			// 将最后一个未用的数字放到这里

+ 10 - 0
hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java

@@ -1,10 +1,12 @@
 package cn.hutool.core.util;
 
+import cn.hutool.core.convert.Convert;
 import org.junit.Assert;
 import org.junit.Test;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.Set;
 
 /**
  * {@link NumberUtil} 单元测试类
@@ -269,4 +271,12 @@ public class NumberUtilTest {
 		Assert.assertTrue(NumberUtil.isPowerOfTwo(1));
 		Assert.assertFalse(NumberUtil.isPowerOfTwo(17));
 	}
+
+	@Test
+	public void generateRandomNumberTest(){
+		final int[] ints = NumberUtil.generateRandomNumber(10, 20, 5);
+		Assert.assertEquals(5, ints.length);
+		final Set<?> set = Convert.convert(Set.class, ints);
+		Assert.assertEquals(5, set.size());
+	}
 }