You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成跨多文件、满足指定统计分布特性的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:06:27