C++17 std::sample
Il s'agit d'une méthode pratique pour obtenir plusieurs éléments aléatoires sans répétition.
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;
}
Compilez et exécutez :
g++-7 -o main -std=c++17 -Wall -Wextra -pedantic main.cpp
./main
Sortie : 3 nombres aléatoires sont choisis parmi 1, 2, 3, 5, 7
sans répétition.
Par souci d'efficacité, seuls O(n)
est garantie puisque ForwardIterator
est l'API utilisée, mais je pense que les implémentations de stdlib vont se spécialiser pour O(1)
lorsque cela est possible (par exemple vector
).
Testé dans GCC 7.2, Ubuntu 17.10. Comment obtenir GCC 7 en 16.04 .