68 votes

Comment obtenir un élément aléatoire à partir d'un conteneur C++ ?

Quelle est la bonne façon d'obtenir un élément [pseudo-]aléatoire à partir d'une plage STL ?

Le mieux que je puisse faire est de faire std::random_shuffle(c.begin(), c.end()) et ensuite prendre mon élément aléatoire dans c.begin() .

Cependant, je pourrais vouloir un élément aléatoire à partir d'un const ou je ne veux peut-être pas payer le coût d'un mélange complet.

Y a-t-il un meilleur moyen ?

2voto

ypnos Points 21940

Prenez le nombre d'éléments, c.size() alors obtenez un random_number entre 0 et c.size() et l'utiliser :

auto it = c.begin();
std::advance(it, random_number)

Jetez un coup d'œil à http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

1voto

Cedekasme Points 667

Vous pouvez essayer d'obtenir un nombre aléatoire entre 0 et le nombre d'éléments du conteneur. Vous pouvez ensuite accéder à l'élément correspondant du conteneur. Par exemple, vous pouvez faire ceci :

#include <cstdlib>
#include <ctime>

// ...
std::srand(std::time(0)); // must be called once at the start of the program
int r = std::rand() % c.size() + 1; 
container_type::iterator it = c.begin();
std::advance(it, r);

-2voto

zcc Points 1

Vous pouvez utiliser la fonction aléatoire 0~1 pour générer un nombre flottant pour chaque élément du conteneur comme son score. Et ensuite sélectionner celui qui a le score le plus élevé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X