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

如何在Hypothesis中生成符合约束的区间集合?

区间集合生成策略

核心思路

通过随机划分可用空白区域的方式生成无重叠区间,同时严格满足所有约束条件。

具体实现步骤

1. 初始化基础参数

  • 准备唯一名称生成逻辑(比如递增序号+固定前缀,或随机字符串),确保每个区间名称不重复。
  • 初始化可用区域列表,初始值为 [(0.0, 1.0)],代表当前可放置区间的空白范围。
  • 确定要生成的区间数量(可固定值,也可设为随机范围,比如1到5个)。

2. 逐个生成区间

针对每个待生成的区间:

  • 从可用区域列表中随机选择一个空白区域 (available_start, available_end)。
  • 随机生成区间size:范围为 (0, available_end - available_start),可使用random.uniform(0, available_end - available_start)实现。
  • 随机确定区间起始位置:start = random.uniform(available_start, available_end - size),再计算end = start + size。
  • 创建符合结构的区间字典:
    {
        "name": f"interval_{unique_id}",  # unique_id自增或随机生成
        "start": round(start, 6),  # 保留小数避免精度误差
        "end": round(end, 6),
        "size": round(end - start, 6)
    }
    
  • 更新可用区域列表:将选中的空白区域替换为(available_start, start)和(end, available_end),仅当子区域长度大于0时(即start > available_start或end < available_end),才添加到列表中。

3. 可选:控制区间分布

若需要避免生成过小的区间,可给size设置最小值(比如size >= 0.05),生成时过滤掉不符合条件的随机值即可。

完整示例代码

import random

def generate_interval_set(num_intervals: int = None) -> list[dict]:
    # 未指定数量时,随机生成1-5个区间
    if num_intervals is None:
        num_intervals = random.randint(1, 5)
    
    available_regions = [(0.0, 1.0)]
    intervals = []
    unique_id = 1
    
    for _ in range(num_intervals):
        if not available_regions:
            break  # 无可用区域时提前终止
        
        # 随机选中一个可用区域
        region_idx = random.randint(0, len(available_regions)-1)
        reg_start, reg_end = available_regions.pop(region_idx)
        reg_length = reg_end - reg_start
        
        # 生成区间大小(预留至少0.01的空白,可调整)
        min_size = 0.01
        size = random.uniform(min_size, reg_length - min_size)
        # 生成起始位置
        start = random.uniform(reg_start, reg_end - size)
        end = start + size
        
        # 构造区间字典
        interval = {
            "name": f"interval_{unique_id}",
            "start": round(start, 6),
            "end": round(end, 6),
            "size": round(size, 6)
        }
        intervals.append(interval)
        unique_id += 1
        
        # 更新可用区域
        if start > reg_start:
            available_regions.append((reg_start, start))
        if end < reg_end:
            available_regions.append((end, reg_end))
    
    return intervals

# 测试生成逻辑
if __name__ == "__main__":
    intervals = generate_interval_set(3)
    for idx, interval in enumerate(intervals):
        print(f"区间{idx+1}: {interval}")

约束条件验证

  • 名称唯一:通过自增的unique_id保证每个区间名称不重复。
  • 无重叠:每次仅从空白区域切割生成新区间,不会占用已使用范围。
  • 范围约束:初始可用区域为(0.0,1.0),所有生成区间均在此范围内。
  • size正确:直接用end - start赋值,确保与计算结果一致。
  • 数量灵活:可指定数量或随机生成,无可用区域时自动终止。

内容的提问来源于stack exchange,提问作者breadjesus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:50:29