¡Hola!
Tu manera de hacerlo es correcta (y eso es lo más importante). Otra manera sería mantener un vector de booleanos en el que marques los elementos que ya has cogido (así no tienes que hacer una búsqueda entre los elementos que ya han salido).
Propongo también esto otro, con listas circulares (y aprovechando que generas elementos entre 0 y 9 únicamente). Me he hecho una clase llamada clist que básicamente es eso, una lista circular. Aquí como resuelvo el problema usando esa clase:
#include <iostream>
#include "circlist/clist.hpp"
int main() {
clist<int> cl;
for (int i = 0; i < 10; ++i) {
cl.insert(i);
cl.rand_sel();
}
for (int i = 0; i < 10; ++i) {
cout << cl.elem() << endl;
++cl;
}
}
Y aquí el fichero de cabecera de la clase:
#ifndef NULL
#define NULL 0
#endif
template <class T>
class clist {
private:
struct Node {
T info;
Node* next;
Node* prev;
};
T hola;
Node* act;
int s;
public:
clist();
~clist();
// Returns the element pointed by act
T elem() const;
// Returns the number of elements of the circular list
int size() const;
// Returns true if there isn't any element in the list. False otherwise
bool empty() const;
// Overloaded = operator
clist& operator=(const clist& cl);
// Insert element inf before the element pointed by act
void insert(const T& inf);
// Erases the element pointed by act from the list
void erase();
// Makes act := act->next
void operator++();
// Makes act := act->prev
void operator--();
// Makes act point to a random element of the list
void rand_sel();
};
#include "clist.cpp"
Si alguien quiere la implementación de las funciones (clist.cpp), ya me lo hará saber. No lo pongo aquí para no hacer el post demasiado largo.
De hecho, he utilizado este mismo método para hacer un pequeño buscaminas y decidir en que casillas estarán las minas ^^. Aunque, de todas formas, lo más eficiente en tiempo es lo del vector de booleanos.
Saludos.
PS: por cierto, un detalle. No hace falta que cambies la semilla en cada iteración. No ganas casi nada y pierdes tiempo. Es mejor hacer el srand al principio del programa y ya está.