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

如何在C#中从List中按均等区间抽取指定数量的样本?

实现均等区间抽取样本的方法

这个需求很常见啊,要从列表里按均等区间抽样本,关键是要计算好每个样本的索引位置,既要保证均匀,又要包含首尾元素(毕竟你的例子里第一个和最后一个元素都在样本里)。

核心思路

因为要抽取SAMPLES_COUNT=4个样本,相当于把原列表分成样本数-1=3个均等区间。原列表有7个元素,索引范围是0到6,总索引跨度为6。每个区间的长度就是 (原列表长度-1)/(样本数-1) = 6/3=2,所以每个样本的索引依次是0、2、4、6,对应的值正好是你例子里的3,7,9,4。

C# 实现代码

下面是完整的实现,还包含了边界情况的处理,避免出现异常:

var numbers = new List<int>(){ 3, 6, 7, 8, 9, 1, 4 };
const int SAMPLES_COUNT = 4;

List<int> GetEvenlySpacedSamples(List<int> source, int sampleCount)
{
    // 边界处理:样本数为0返回空列表
    if (sampleCount <= 0)
        return new List<int>();
    // 样本数大于等于原列表长度时,直接返回原列表的副本
    if (sampleCount >= source.Count)
        return new List<int>(source);
    
    var samples = new List<int>();
    // 计算步长:用总索引跨度除以区间数,确保首尾元素都能被选中
    double step = (double)(source.Count - 1) / (sampleCount - 1);
    
    for (int i = 0; i < sampleCount; i++)
    {
        // 通过四舍五入计算当前样本的索引,保证分布更均衡
        int index = (int)Math.Round(i * step);
        samples.Add(source[index]);
    }
    
    return samples;
}

// 调用方法获取样本
var samples = GetEvenlySpacedSamples(numbers, SAMPLES_COUNT);
// 输出结果:[3, 7, 9, 4]

补充说明

如果原列表长度和样本数的比值不是整数(比如原列表有8个元素,要抽5个样本),步长会是小数(8-1)/(5-1)=1.75,此时通过Math.Round取整,得到的索引会是0、2、4、6、7,依然能保证样本均匀分布。

如果你有特殊需求,也可以把Math.Round换成Math.Floor或Math.Ceiling,但四舍五入的方式通常是最均衡的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:27:43