随机工具 - RandomUtil

由来

Java 中 Random 类使用不够便捷,RandomUtil 封装了常用的随机操作。Python 版基于 randomsecrets 模块实现。

方法

基础随机

from hutool import RandomUtil

RandomUtil.random_int(1, 100)          # 1~99 的随机整数
RandomUtil.random_int()                # 0~MAX 的随机整数
RandomUtil.random_float(0.0, 1.0)     # 随机浮点数
RandomUtil.random_boolean()            # 随机布尔值
RandomUtil.random_bytes(16)            # 16 字节随机数据

随机字符串

RandomUtil.random_string(10)           # "aB3dE5fG7h"(10位随机字符串)
RandomUtil.random_string_upper(8)      # "ABCDEFGH"(大写)
RandomUtil.random_string_lower(8)      # "ab3cd5ef"(小写+数字)
RandomUtil.random_numbers(6)           # "384756"(纯数字)

随机选择

items = ["apple", "banana", "cherry"]
RandomUtil.random_ele(items)           # 随机选一个
RandomUtil.random_eles(items, 2)       # 随机选两个

加权随机

# 按权重随机选择
RandomUtil.weighted_choice(["a", "b", "c"], [1, 2, 3])
# "c" 出现概率最高(权重 3/6)

其他

# 随机颜色
RandomUtil.random_color()              # "#a1b2c3"(随机十六进制颜色)

# 随机中文字符
RandomUtil.random_chinese(5)  # 5个随机汉字

# 从字符集随机取一个字符
RandomUtil.random_char("abc")  # "a" 或 "b" 或 "c"

# 随机日期(仅日期,无时分秒)
from datetime import datetime
RandomUtil.random_day(datetime(2024, 1, 1), datetime(2024, 12, 31))

# 随机整数列表(可重复)
RandomUtil.random_ints(5, 1, 10)  # 5个[1,10)范围的随机整数

# 排除指定字符的随机字符串
RandomUtil.random_string_without_str(20, "aeiou")   # 不含元音字母的随机字符串
RandomUtil.random_string_lower_without_str(10, "xz") # 小写,不含 x 和 z

# 按条件随机选取
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
RandomUtil.random_ele_with_condition(data, lambda x: x > 5, 3)  # 3个>5的随机数

# 随机生成器工厂
rng = RandomUtil.create_secure_random()           # 创建随机数生成器
rng = RandomUtil.create_secure_random(b"seed")     # 带种子(可复现)
rng = RandomUtil.get_secure_random()               # 默认随机数生成器
rng = RandomUtil.get_secure_random_strong()        # 强随机数生成器

# 带边界控制的随机整数
RandomUtil.random_int_with_bound(1, 10, include_min=True, include_max=True)  # [1,10]
RandomUtil.random_int_with_bound(1, 10, include_min=False, include_max=False)  # (1,10)

# 随机长整数
RandomUtil.random_long()           # 0~2^63 的随机长整数
RandomUtil.random_long(10, 100)    # [10, 100)

# 随机排列
RandomUtil.random_ints_permutation(5)  # [0, 5) 的随机排列,如 [3, 0, 4, 1, 2]

# 随机字符
RandomUtil.random_number_char()    # 随机数字字符 '0'-'9'
RandomUtil.random_char_no_arg()    # 大小写字母+数字中随机取一个

# 不重复随机元素
RandomUtil.random_ele_list(items, 3)   # 不重复列表
RandomUtil.random_ele_set(items, 3)    # 不重复集合

# 从前 N 个元素中随机取
RandomUtil.random_ele_from_first_n(items, 3)  # 从前3个中随机取1个

# weight_random 别名
RandomUtil.weight_random([(1, "a"), (9, "b")])  # "b" 概率更高

# 允许重复选取
RandomUtil.random_eles(items, 5, allow_duplicate=True)  # 可重复

日期时间随机

from datetime import datetime

# 随机日期时间
RandomUtil.random_datetime(datetime(2024, 1, 1), datetime(2024, 12, 31))

# 随机日期(仅日期部分)
RandomUtil.random_date(datetime(2024, 1, 1), datetime(2024, 12, 31))

高级随机字符串

# 纯数字随机字符串
RandomUtil.random_digits(8)  # "38475612"(8位纯数字)

# 字母+数字随机字符串
RandomUtil.random_alphanumeric(10)  # "aB3dE5fG7h"

# 大写字母随机字符串
RandomUtil.random_upper_ascii(6)  # "ABCDEF"

加权随机类

from hutool import WeightedRand

# 创建加权随机选择器
wr = WeightedRand([("a", 1), ("b", 2), ("c", 3)])
wr.next()   # 按权重随机返回 "a"/"b"/"c"
wr.next()