From 03e45bc5142f8465bf29d02ac9563c025d9afee5 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 11 Oct 2020 13:19:17 +0800 Subject: [PATCH] fix NumberUtil --- CHANGELOG.md | 1 + .../java/cn/hutool/core/util/NumberUtil.java | 31 ++++++++++++------- .../cn/hutool/core/util/NumberUtilTest.java | 10 ++++++ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db2dc718c..7b0b4ae12 100644 --- a/CHANGELOG.md +++ b/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) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 8465c0f29..737f7347d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/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 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]; // 将最后一个未用的数字放到这里 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index d0de97034..8891b4986 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/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()); + } }