2011-03-21 13 views
5

Me gustaría hacer un generador de números que no repita el número que ha dado (C++).Generador de números aleatorios no repetitivo

único que sé es:

int randomgenerator(){ 
    int random; 
    srand(time(0)); 
    random = rand()%11; 
    return(random); 
} // Added this on edition 

Esa función me da los números redundantes.

Estoy tratando de crear un programa de cuestionario que dé 10 preguntas en orden aleatorio y no quiero que ninguna de las preguntas vuelva a aparecer.

¿Alguien sabe la sintaxis?

+1

Si su generador de números aleatorios no puede repetir, pierde un aspecto importante de la aleatoriedad. Si alguien conoce el período, su precisión de conjeturas aumenta a medida que se acerca al final del período, con un 100% de certeza en la última estimación. – corsiKa

+5

srand() debe ejecutarse ** UNA VEZ ** y solo una vez al inicio del programa. –

+0

Simplemente podría almacenar como último el último valor, y si el nuevo valor es igual al último, agregue un número aleatorio entre 1 y el valor máximo que desea menos el número que obtuvo. Puedes hacer esto simplemente con módulo y es más aleatorio que simplemente usar rand() :) –

Respuesta

18

Lo que yo haría:

  • generar un vector de longitud N y llenarlo con valores de 1,2, ... N.
  • Use std::random_shuffle.
  • Si tiene 30 elementos y solo quiere 10, use los primeros 10 del vector.

EDIT: No tengo ni idea de cómo se almacenan las preguntas, así que .. :)

Estoy asumiendo las preguntas están siendo almacenados en un vector o algo por el estilo con el acceso aleatorio. Ahora he generado 10 números aleatorios que no se repiten: 7, 4, 12, 17, 1, 13, 9, 2, 3, 10.

me gustaría utilizar los índices como para el vector de preguntas:

std::vector<std::string> questions; 
//fill with questions 
for(int i = 0; i < number_of_questions; i++) 
{ 
    send_question_and_get_answer(questions[i]); 
} 
+0

+1 ¡Porque es más rápido que Jon! – ybungalobill

+5

+1 ¡Porque más rápido que el mío! :) – Jon

+0

Me gusta esta, pero sigo sin tener idea de cómo me ayudará a responder las preguntas. –

7

Está tratando de resolver el problema "de la manera incorrecta".

Prueba este lugar (suponiendo que tiene un vector<int> con ID de preguntas, pero la misma idea va a trabajar con lo que tienes):

  1. Obtener una aleatorio R de 0 a N-1, donde N es el número de preguntas en el contenedor
  2. Agregar pregunta R a otra colección de preguntas "seleccionados"
  3. Si las "preguntas seleccionadas" colección tiene suficientes elementos, haya terminado
  4. Quitar pregunta R desde su envase original (ahora N ha disminuido en 1)
  5. Ir a 1
+0

hola, ¿podría ayudarme a crear la función real? Soy nuevo en C++ y no tengo idea de qué es el vector. D: –

+0

@Jpeh: ¿Cómo se almacenan sus preguntas? Además, es esta tarea? – Jon

+0

Estoy usando la función que escribí en la pregunta para elegir un número aleatorio entre 0-10, y devuelvo el valor a mi programa principal. Cualquiera que sea el valor que sea equivalente a una determinada pregunta (por ejemplo, si es aleatorio == 1, llamaré a la función: "pregunta 1". No, no es una tarea. Solo soy un entusiasta de la programación aquí: D –

6

Suena como que esencialmente quiere shuffle a deck of cards (en este caso, son las "tarjetas" las preguntas, o números de las preguntas).

En C++, lo haría:

#include <vector> 
#include <algorithms> 

std::vector<int> question_numbers; 
for (unsigned int i = 0; i < 10; ++i) 
    question_numbers.push_back(i+1); 
std::random_shuffle(question_numbers.begin(), question_numbers.end()); 

// now dole out the questions based on the shuffled numbers 

Usted no tiene que entregar todas las preguntas, más de lo que tiene que hacer frente a toda una baraja de cartas cada vez que juega un juego. Puedes, por supuesto, pero no hay tal requisito.

4

Crea un vector de 10 elementos (números del 1 al 10), luego muévelo, con std::random_shuffle. Luego simplemente itera a través de él.

+0

@Benjamin: Creo que lo que el OP quiere es seleccionar al azar N de M. – Jon

+2

@Jon : Sí, así que solo itera a través de N elementos. –

+0

@Jon: eso es esencialmente lo mismo, pero este enfoque te da O (N + M) mientras que O (NM). – ybungalobill

1

debe mirar más a esto: (Nota: no soluciona el problema original).

int randomgenerator(){ 
    int random; 

    // I know this looks re-dunand compared to %11 
    // But the bottom bits of rand() are less random than the top 
    // bits do you get a better distribution like this. 

    random = rand()/(RAND_MAX/11); 

    return random; 
} 

int main() 
{ 
    // srand() goes here. 
    srand(time(0)); 

    while(true) 
    { 
     std::cout << randomgenerator() << "\n"; 
    } 
} 

Una mejor manera de resolver el problema original es comprobar la validez de generar los números para que sepa que cada número aparecerá sólo una vez. Luego baraja el orden aleatoriamente.

int main() 
{ 
    int data[] = { 0,1,2,3,4,5,6,7,8,9,10,11}; 
    int size = sizeof(data)/sizeof(data[0]); 

    std::random_shuffle(data, data + size); 

    for(int loop = 0; loop < size; ++loop) 
    { 
     std::cout << data[loop] << "\n"; 
    } 
} 
Cuestiones relacionadas