如何生成跨多文件、满足指定统计分布特性的JSON数据文件
实现方案
核心逻辑很简单:不要给每个文件独立生成random字段——这种独立采样的方式得到的重复值分布是泊松分布,根本匹配不了你要的正态分布规律。正确做法是先按分布要求把所有文件分好组,同一个组共用同一个random值,再给每个组分配不重复的10位随机串即可。
具体步骤
- 先确定正态分布参数:根据你的需求设定均值μ(比如你举例的平均10个文件共用一个值,就设μ=10)和标准差σ,σ越大不同组的大小差异越明显。注意做边界截断:分组大小不可能为0或负数,采样到小于1的值直接强制设为1即可。
- 生成符合分布的分组序列,凑够总文件数X:循环从设定好的正态分布中采样整数作为单个分组的大小,累加分组大小直到总和等于X。最后一个分组如果超出剩余待分配的文件数,直接把大小调整为剩余值即可,保证总文件数完全匹配。
- 为每个分组分配唯一的10位随机数字串:直接复用你原来写的
generateRandomStringWith10Digits()函数即可,加个去重判断,确保不同分组拿到的random值不重复,避免串组打乱分布。 - 输出最终JSON文件:遍历所有分组,给组内每个文件(对应username按
user+i的规则生成)分配当前组的random值,按要求的结构存成单独JSON即可。
你提到的分布参考效果如下:
相同random值对应文件数的正态分布示例
参考实现代码
import math import random import numpy as np # 原有的10位随机数字串生成函数 def generateRandomStringWith10Digits(): result = "" chars = "0123456789" charsLength = len(chars) for i in range(10): result += chars[math.floor(random.random() * charsLength)] return result def generate_group_sizes(total_files: int, mean: float, std: float): groups = [] current_total = 0 while current_total < total_files: # 正态分布采样取整,最小分组大小为1 group_size = max(1, int(round(np.random.normal(mean, std)))) if current_total + group_size > total_files: # 最后一个分组补全剩余文件数 group_size = total_files - current_total groups.append(group_size) current_total += group_size return groups def build_all_json_configs(total_x: int, group_mean: int, group_std: float): # 生成符合正态分布大小的分组 group_sizes = generate_group_sizes(total_x, group_mean, group_std) # 为每个组分配不重复的随机串 group_rand_map = {} used_rand_str = set() for group_id in range(len(group_sizes)): while True: rand_str = generateRandomStringWith10Digits() if rand_str not in used_rand_str: used_rand_str.add(rand_str) group_rand_map[group_id] = rand_str break # 组装所有JSON配置 config_list = [] user_index = 0 for group_id, size in enumerate(group_sizes): current_rand = group_rand_map[group_id] for _ in range(size): config_list.append({ "username": f"user{user_index}", "random": current_rand }) user_index += 1 return config_list # 调用示例:生成1000个JSON配置,平均10个文件共用一个random值,标准差为2 if __name__ == "__main__": all_configs = build_all_json_configs(total_x=1000, group_mean=10, group_std=2) # 此处可自行遍历all_configs,将每个配置写入单独JSON文件
注:如果不想依赖numpy做正态分布采样,自己实现Box-Muller变换就可以生成符合正态分布的随机数,逻辑非常简单。
内容的提问来源于stack exchange,提问作者BloodyOrange
相关产品推荐
相关产品推荐

