All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xiaoleilu.hutool.util.RandomUtil Maven / Gradle / Ivy

package com.xiaoleilu.hutool.util;

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

import com.xiaoleilu.hutool.exceptions.UtilException;

/**
 * 随机工具类
 * 
 * @author xiaoleilu
 *
 */
public class RandomUtil {

	/** 用于随机选的数字 */
	private static final String BASE_NUMBER = "0123456789";
	/** 用于随机选的字符 */
	private static final String BASE_CHAR = "abcdefghijklmnopqrstuvwxyz";
	/** 用于随机选的字符和数字 */
	private static final String BASE_CHAR_NUMBER = BASE_CHAR + BASE_NUMBER;

	/**
	 * 获取随机数生成器对象
* ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 * * @return {@link ThreadLocalRandom} * @since 3.1.2 */ public static ThreadLocalRandom getRandom() { return ThreadLocalRandom.current(); } /** * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) * * @return {@link SecureRandom} * @since 3.1.2 */ public static SecureRandom getSecureRandom() { try { return SecureRandom.getInstance("SHA1PRNG"); } catch (NoSuchAlgorithmException e) { throw new UtilException(e); } } /** * 获得指定范围内的随机数 * * @param min 最小数(包含) * @param max 最大数(不包含) * @return 随机数 */ public static int randomInt(int min, int max) { return getRandom().nextInt(min, max); } /** * 获得随机数 * * @return 随机数 */ public static int randomInt() { return getRandom().nextInt(); } /** * 获得指定范围内的随机数 [0,limit) * * @param limit 限制随机数的范围,不包括这个数 * @return 随机数 */ public static int randomInt(int limit) { return getRandom().nextInt(limit); } /** * 获得指定范围内的随机数 * * @param min 最小数(包含) * @param max 最大数(不包含) * @return 随机数 * @since 3.3.0 */ public static long randomLong(long min, long max) { return getRandom().nextLong(min, max); } /** * 获得随机数 * * @return 随机数 * @since 3.3.0 */ public static long randomLong() { return getRandom().nextLong(); } /** * 获得指定范围内的随机数 [0,limit) * * @param limit 限制随机数的范围,不包括这个数 * @return 随机数 */ public static long randomLong(long limit) { return getRandom().nextLong(limit); } /** * 获得指定范围内的随机数 * * @param min 最小数(包含) * @param max 最大数(不包含) * @return 随机数 * @since 3.3.0 */ public static double randomDouble(double min, double max) { return getRandom().nextDouble(min, max); } /** * 获得随机数 * * @return 随机数 * @since 3.3.0 */ public static double randomDouble() { return getRandom().nextDouble(); } /** * 获得指定范围内的随机数 [0,limit) * * @param limit 限制随机数的范围,不包括这个数 * @return 随机数 * @since 3.3.0 */ public static double randomDouble(Double limit) { return getRandom().nextDouble(limit); } /** * 随机bytes * * @param length 长度 * @return bytes */ public static byte[] randomBytes(int length) { byte[] bytes = new byte[length]; getRandom().nextBytes(bytes); return bytes; } /** * 随机获得列表中的元素 * * @param 元素类型 * @param list 列表 * @return 随机元素 */ public static T randomEle(List list) { return randomEle(list, list.size()); } /** * 随机获得列表中的元素 * * @param 元素类型 * @param list 列表 * @param limit 限制列表的前N项 * @return 随机元素 */ public static T randomEle(List list, int limit) { return list.get(randomInt(limit)); } /** * 随机获得数组中的元素 * * @param 元素类型 * @param array 列表 * @return 随机元素 * @since 3.3.0 */ public static T randomEle(T[] array) { return randomEle(array, array.length); } /** * 随机获得数组中的元素 * * @param 元素类型 * @param array 列表 * @param limit 限制列表的前N项 * @return 随机元素 * @since 3.3.0 */ public static T randomEle(T[] array, int limit) { return array[randomInt(limit)]; } /** * 随机获得列表中的一定量元素 * * @param 元素类型 * @param list 列表 * @param count 随机取出的个数 * @return 随机元素 */ public static List randomEles(List list, int count) { final List result = new ArrayList(count); int limit = list.size(); while (--count > 0) { result.add(randomEle(list, limit)); } return result; } /** * 随机获得列表中的一定量的不重复元素,返回Set * * @param 元素类型 * @param collection 列表 * @param count 随机取出的个数 * @return 随机元素 * @throws IllegalArgumentException 需要的长度大于给定集合非重复总数 */ public static Set randomEleSet(Collection collection, int count) { ArrayList source = new ArrayList<>(new HashSet<>(collection)); if (count > source.size()) { throw new IllegalArgumentException("Count is larger than collection distinct size !"); } final HashSet result = new HashSet(count); int limit = collection.size(); while (result.size() < count) { result.add(randomEle(source, limit)); } return result; } /** * 获得一个随机的字符串(只包含数字和字符) * * @param length 字符串的长度 * @return 随机字符串 */ public static String randomString(int length) { return randomString(BASE_CHAR_NUMBER, length); } /** * 获得一个只包含数字的字符串 * * @param length 字符串的长度 * @return 随机字符串 */ public static String randomNumbers(int length) { return randomString(BASE_NUMBER, length); } /** * 获得一个随机的字符串 * * @param baseString 随机字符选取的样本 * @param length 字符串的长度 * @return 随机字符串 */ public static String randomString(String baseString, int length) { final StringBuilder sb = new StringBuilder(); if (length < 1) { length = 1; } int baseLength = baseString.length(); for (int i = 0; i < length; i++) { int number = getRandom().nextInt(baseLength); sb.append(baseString.charAt(number)); } return sb.toString(); } /** * 随机数字 * * @return 随机字符 * @since 3.1.2 */ public static int randomNumber() { return randomChar(BASE_NUMBER); } /** * 随机字母或数字,小写 * * @return 随机字符 * @since 3.1.2 */ public static char randomChar() { return randomChar(BASE_CHAR_NUMBER); } /** * 随机字符 * * @param baseString 随机字符选取的样本 * @return 随机字符 * @since 3.1.2 */ public static char randomChar(String baseString) { return baseString.charAt(getRandom().nextInt(baseString.length())); } /** * @return 随机UUID */ public static String randomUUID() { return UUID.randomUUID().toString(); } // ------------------------------------------------------------------- UUID /** * 简化的UUID,去掉了横线 * * @return 简化的UUID,去掉了横线 * @since 3.2.2 */ public static String simpleUUID() { return randomUUID().replace("-", ""); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy