data_factory/utils/random_utils.py

107 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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))