fix NumberUtil

This commit is contained in:
Looly 2020-10-11 13:19:17 +08:00
parent a341ad0198
commit 03e45bc514
3 changed files with 31 additions and 11 deletions

View File

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

View File

@ -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];
// 将最后一个未用的数字放到这里

View File

@ -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());
}
}