Если вы хотите выбрать большую часть столбцов (т. Е. K не намного меньше n), или если веса очень искажены, вы можете использовать это уточнение решения Джеффа, которое гарантирует, что каждый вызовrandsample производит выборки, отличные от предыдущих.
Более того, он возвращает выборки в порядке, в котором истинная выборка без замены вернула бы их, а не отсортировала.
function I=randsample_noreplace(n,k,w)
I = randsample(n, k, true, w);
while 1
[II, idx] = sort(I);
Idup = [false, diff(II)==0];
if ~any(Idup)
break
else
w(I) = 0; %% Don't replace samples
Idup (idx) = Idup; %% find duplicates in original list
I = [I(~Idup), (randsample(n, sum(Idup), true, w))];
end
end
При выборе 29из 30 значений с одинаковыми весами (случай, который дает наименьшее преимущество), требуется 3 или 4 итерации, по сравнению с 26 без дополнительной строки.Если веса выбираются равномерно, все равно требуется от 3 до 5 итераций по сравнению с приблизительно 80 без дополнительной строки.
Кроме того, число итераций ограничено k, однако перекошено распределение.