Алгоритм для выборки без замены?

14
задан Ciro Santilli 新疆改造中心法轮功六四事件 27 February 2017 в 11:10
поделиться

2 ответа

См. мой ответ на этот вопрос Уникальный (неповторение) случайные числа в O (1)? . Та же логика должна выполнить то, что Вы надеетесь делать.

5
ответ дан 1 December 2019 в 06:11
поделиться

Вот некоторый код для выборки без замены на основе Алгоритма 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.

37
ответ дан 1 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: