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