увеличить случайную выборку, как Python random.sample

Я пытаюсь использовать C ++ для имитации Python

random.sample(a_set, n_samples)

Функция C ++ как

set<string> sample(set<string> input, int n_samples)

Прежде чем написать свою собственную, какая-нибудь библиотека делает это? У меня есть повышение 1.46 на моем компьютере.

3

Решение

Проблема, которую вы хотите решить, называется отбор проб из пласта. Я попытался поискать в Google для «реализации выборки резервуара c ++». Google автоматически завершает запрос для меня, но беглый взгляд на результаты не показывает реальную библиотеку.

Алгоритм очень прост и забавен для изучения и написания самостоятельно, поэтому я бы порекомендовал это.

1

Другие решения

SGI реализация STL имеет random_sample а также random_sample_n функции:

template <class InputIterator, class RandomAccessIterator>
Random AccessIterator random_sample(InputIterator first, InputIterator last,
RandomAccessIterator ofirst,
RandomAccessIterator olast)

template <class ForwardIterator, class OutputIterator, class Distance>
OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,
OutputIterator out, Distance n)

random_sample_n случайным образом копирует выборку элементов из диапазона [first, last) в диапазон [out, out + n), Каждый элемент во входном диапазоне появляется не более одного раза в выходном диапазоне, и выборки выбираются с одинаковой вероятностью.

к несчастью

Мэтт Остерн предложил несколько дополнительных алгоритмов (в основном взятых из оригинальной реализации SGI для стандартной библиотеки SGI). Среди них были
random_sample а также random_sample_n

(от N3925)

но

После рассмотрения WG21 на совещании в Софии-Антиполисе Остерн обновил предложение, выпустив [N2666]. Среди других изменений он отозвал алгоритмы выборки, потому что «LWG была обеспокоена тем, что они могут быть недостаточно хорошо поняты для стандартизации … Может быть целесообразно предложить эти алгоритмы для TR2». LWG впоследствии добилась прочного
консенсус (10-1, 2 абс.) в поддержку включения этих алгоритмов в будущий Технический отчет (теперь называемый Технической спецификацией).

Версия random_sample_n алгоритм добрался до библиотеки Основы ТС и называется std::experimental::sample, последняя итерация предложения N3925 был принят в 2014-02, но еще не является частью стандарта (вероятно, в C ++ 17).

В дополнение к алгоритму отбора проб пласта, вы можете взглянуть на хорошо известный алгоритмы Sметодика выборочной выборки«) разъяснил Дональд Кнут в» Искусство компьютерного программирования «- Том 2 — §3.4.2.

0

По вопросам рекламы [email protected]