如何在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
相关产品推荐
相关产品推荐

