Я пытаюсь использовать C ++ для имитации Python
random.sample(a_set, n_samples)
Функция C ++ как
set<string> sample(set<string> input, int n_samples)
Прежде чем написать свою собственную, какая-нибудь библиотека делает это? У меня есть повышение 1.46 на моем компьютере.
Проблема, которую вы хотите решить, называется отбор проб из пласта. Я попытался поискать в Google для «реализации выборки резервуара c ++». Google автоматически завершает запрос для меня, но беглый взгляд на результаты не показывает реальную библиотеку.
Алгоритм очень прост и забавен для изучения и написания самостоятельно, поэтому я бы порекомендовал это.
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.