См. мой ответ на этот вопрос Уникальный (неповторение) случайные числа в O (1)? . Та же логика должна выполнить то, что Вы надеетесь делать.
Вот некоторый код для выборки без замены на основе Алгоритма 3.4.2S книги Knuth Получисловые Алгоритмы.
void SampleWithoutReplacement
(
int populationSize, // size of set sampling from
int sampleSize, // size of each sample
vector<int> & samples // output, zero-offset indicies to selected items
)
{
// Use Knuth's variable names
int& n = sampleSize;
int& N = populationSize;
int t = 0; // total input records dealt with
int m = 0; // number of items selected so far
double u;
while (m < n)
{
u = GetUniform(); // call a uniform(0,1) random number generator
if ( (N - t)*u >= n - m )
{
t++;
}
else
{
samples[m] = t;
t++; m++;
}
}
}
существует более эффективный, но более сложный метод Jeffrey Scott Vitter в "Эффективном Алгоритме для Последовательной Случайной Выборки", Транзакции ACM на Математическом программном обеспечении, 13 (1), март 1987, 58-67.