如何用randperm函数在30个实例的三个分段中各选4个不同样本?
解决randperm选取指定区间不重复实例的问题
我懂你的困扰——直接用randperm(n,k)选11-20号实例时,没法限定范围,很容易误选到1-10号的未选中数据。其实只要给随机生成的结果加个区间偏移量就能完美解决,操作起来特别简单:
核心思路
你要选的三个区间长度都是10(1-10、11-20、21-30),我们可以先在1-10的范围内用randperm(10,4)生成4个不重复的随机数,再给结果加上对应的偏移值,就能精准映射到目标区间:
- 11-20号区间:偏移量设为10,生成的数+10就从1-10变成11-20
- 21-30号区间:偏移量设为20,生成的数+20就从1-10变成21-30
具体代码示例
% 从1-10号实例中随机选4个不重复的 selected_1_10 = randperm(10,4); % 从11-20号实例中随机选4个不重复的(完全不会包含1-10的实例) selected_11_20 = randperm(10,4) + 10; % 从21-30号实例中随机选4个不重复的 selected_21_30 = randperm(10,4) + 20; % 合并所有选中的实例索引 all_selected = [selected_1_10, selected_11_20, selected_21_30];
方法原理说明
randperm(10,4)只会生成1到10之间不重复的整数,加上偏移量后,这些数会被整体平移到你需要的区间内,完全不会和其他区间的实例重叠,刚好满足你的需求:三个区间各选4个不同的数据,互相之间也没有重复。
如果以后遇到不同长度的区间,也可以套用这个逻辑:先算出目标区间的长度len = 区间结束值 - 区间起始值 + 1,生成randperm(len, k)后,再加上区间起始值 - 1,就能得到对应区间的随机索引。
内容的提问来源于stack exchange,提问作者P Satish Patro
相关产品推荐
相关产品推荐

