C ++ 17 std::sample
Это удобный метод для получения нескольких случайных элементов без повторений.
main.cpp
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
int main() {
const std::vector<int> in{1, 2, 3, 5, 7};
std::vector<int> out;
size_t nelems = 3;
std::sample(in.begin(), in.end(), std::back_inserter(out),
nelems, std::mt19937{std::random_device{}()});
for (auto i : out)
std::cout << i << std::endl;
}
Компиляция и запуск:
g++-7 -o main -std=c++17 -Wall -Wextra -pedantic main.cpp
./main
Вывод: 3 случайных числа выбираются из 1, 2, 3, 5, 7
без повторений.
Для эффективности только O(n)
являетсягарантировано, поскольку ForwardIterator
является используемым API, но я думаю, что реализации stdlib будут специализироваться на O(1)
, где это возможно (например, vector
).
Протестировано в GCC 7.2, Ubuntu 17.10. Как получить GCC 7 в 16.04 .