107 lines
3.5 KiB
Python
107 lines
3.5 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
# @Time : 2025/3/15 17:01
|
||
# @Author : AngesZhu
|
||
# @File : random_utils.py
|
||
# @Desc : 随机数字
|
||
import random
|
||
import string
|
||
from typing import Union, List
|
||
|
||
|
||
class RandomGenerator:
|
||
def __init__(self):
|
||
self.letters = string.ascii_letters
|
||
self.digits = string.digits
|
||
self.special_chars = string.punctuation
|
||
|
||
def generate_number(self,
|
||
min_val: Union[int, float] = 0,
|
||
max_val: Union[int, float] = 100,
|
||
decimal_places: int = 2,
|
||
is_percentage: bool = False) -> Union[int, float]:
|
||
"""
|
||
生成随机数字
|
||
:param min_val: 最小值
|
||
:param max_val: 最大值
|
||
:param decimal_places: 小数位数(仅当结果为浮点数时有效)
|
||
:param is_percentage: 是否生成百分比数
|
||
:return: 随机数字
|
||
"""
|
||
if isinstance(min_val, int) and isinstance(max_val, int):
|
||
result = random.randint(min_val, max_val)
|
||
else:
|
||
result = round(random.uniform(min_val, max_val), decimal_places)
|
||
|
||
return result / 100 if is_percentage else result
|
||
|
||
def generate_letter(self, uppercase: bool = False) -> str:
|
||
"""
|
||
生成随机字母
|
||
:param uppercase: 是否大写
|
||
:return: 随机字母
|
||
"""
|
||
return random.choice(string.ascii_uppercase if uppercase else string.ascii_lowercase)
|
||
|
||
def generate_special_char(self) -> str:
|
||
"""
|
||
生成随机特殊字符
|
||
:return: 随机特殊字符
|
||
"""
|
||
return random.choice(self.special_chars)
|
||
|
||
def generate(self,
|
||
types: List[str] = ['number', 'letter', 'special'],
|
||
length: int = 1,
|
||
**kwargs) -> Union[str, List[str]]:
|
||
"""
|
||
综合生成器
|
||
:param types: 生成类型列表,可选:'number', 'letter', 'special'
|
||
:param length: 生成结果的长度
|
||
:param kwargs: 其他参数,传递给具体的生成方法
|
||
:return: 随机生成结果
|
||
"""
|
||
if not types:
|
||
raise ValueError("至少需要指定一种生成类型")
|
||
|
||
generators = {
|
||
'number': self.generate_number,
|
||
'letter': self.generate_letter,
|
||
'special': self.generate_special_char
|
||
}
|
||
|
||
results = []
|
||
for _ in range(length):
|
||
chosen_type = random.choice(types)
|
||
generator = generators[chosen_type]
|
||
results.append(str(generator(**kwargs.get(chosen_type, {}))))
|
||
|
||
return results[0] if length == 1 else results
|
||
|
||
|
||
# 使用示例
|
||
if __name__ == "__main__":
|
||
rg = RandomGenerator()
|
||
|
||
# 生成一个随机整数
|
||
print(rg.generate(types=['number'], number={'min_val': 1, 'max_val': 100}))
|
||
|
||
# 生成一个随机小数(保留2位)
|
||
print(rg.generate(types=['number'], number={'min_val': 0.0, 'max_val': 1.0, 'decimal_places': 15}))
|
||
|
||
# 生成一个随机百分比数
|
||
print(rg.generate(types=['number'], number={'is_percentage': True}))
|
||
|
||
# 生成一个随机大写字母
|
||
print(rg.generate(types=['letter'], letter={'uppercase': True}))
|
||
|
||
# 生成一个随机特殊字符
|
||
print(rg.generate(types=['special']))
|
||
|
||
# 生成10个随机字符(包含数字、字母、特殊字符)
|
||
print(rg.generate(length=10))
|
||
|
||
# 生成5个随机字符(仅包含字母和数字)
|
||
print(rg.generate(types=['number', 'letter'], length=5))
|
||
|
||
print(rg.generate(types=['number', 'letter'], letter={'uppercase': True}, length=5)) |