Cómo aleatorizar preguntas en el programa de prueba C

La idea de simplemente dibujar números aleatorios ‘n’ para obtener una lista ‘codificada’ de preguntas ‘n’ es seriamente defectuosa. Podrías terminar fácilmente repitiendo algunas preguntas.

Si agrega un cheque para evitar duplicados, en teoría podría terminar en un bucle sin fin tratando de obtener el índice de las últimas una o dos preguntas.

Un mejor enfoque genérico para codificar una secuencia de n objetos es definir un módulo como este:

#include

// estructura contiene un par que representa un valor
// en la secuencia requerida y un valor aleatorio utilizado para ordenar

typedef struct {size_t i; int random_key; } índice_sortable;

// Simplemente compare las claves aleatorias para dos valores de índice sortable

static int compare_indices (const void * l, const void * r)
{
sortable_index * l_index = (sortable_index *) l;
sortable_index * r_index = (sortable_index *) r;
return l_index-> ​​random_key – r_index-> ​​random_key;
}

// Genera una secuencia codificada en el intervalo cerrado [de, a]
// y devuelve la secuencia en una lista asignada dinámicamente.
//
// La persona que llama debe liberar la memoria devuelta
//
// Ejemplo:
// question_order = get_random_sequence (1,20);
// para (size_t q = 0; q <20; q ++) {
// size_t q_number = question_order [q];
// ask_question (q_number, preguntas [q_number-1]);
//}
// libre (question_order);

size_t * get_random_sequence (size_t de, size_t a)
{
size_t len ​​= a + 1 – desde; // longitud de secuencia

// para secuencias grandes, esto debería ser malloc’d
espacio de trabajo de índice sortable [len];

// rellena la matriz
size_t seq_value = from;
para (size_t i = 0; i <len; ++ i, ++ seq_value)
{
espacio de trabajo [i] .i = valor_seq;
espacio de trabajo [i] .random_key = rand ();
}

// ordena los elementos de secuencia en los valores de clave aleatorios
qsort (espacio de trabajo, sizeof (índice_ordenable), len, comparar_indices);

// Ahora extrae la secuencia revuelta
size_t * result = malloc (len * sizeof (size_t));
afirmar (resultado);

para (size_t i = 0; i <len; ++ i)
{
resultado [i] = espacio de trabajo [i] .i;
}

resultado de retorno;
}

Está garantizado que se completará, realizará con precisión n llamadas a rand() , y tiene una complejidad de ejecución determinista de [math] O (n) [/ math] en todo menos en el caso patológico (que no debería suceder si rand está bien escrito).

Nota: este es el código de la pizarra, nunca compilado o probado

Necesitas usar un generador de números aleatorios.

Eso se puede hacer fácilmente en C con stdlib y tiempo

#include
#include

Necesita instanciar su generador pseudoaleatorio con

srand (tiempo (NULL)); // Ponga esto en algún lugar al comienzo de su código. Necesitas llamarlo una vez.

Luego generas un número aleatorio:

/ * aleatorio int entre 0 y 19 si tiene 20 preguntas * /
int r = rand ()% 20;

Entonces sugeriría cambiar su código para que sea más genérico.

Una pregunta siempre está compuesta por una “pregunta”, 4 “respuestas posibles” y una de ellas es la buena respuesta.

(No voy a escribir todo aquí, pero entenderás la idea)

Cree una estructura para contener los datos de su pregunta:

typedef struct test {// Puedes tener un nombre mejor
char * pregunta;
char * responde [4];
char goodAnswer; // No necesitamos un int para eso (0,1,2 o 3)
} prueba;

Luego creas una serie de “pruebas”

prueba t [3]; // Puedes pensar en mejores nombres de variables. Aquí tenemos 3 preguntas
// Voy a crear uno.

t [0] .question = “¿Quién es el presidente de los Estados Unidos?”;
t [0] .answers [0] = “Barak Obama”;
t [0] .answers [1] = “Bill Clinton”;
t [0] .answers [2] = “Pato Donald”;
t [0] .answers [3] = “Francois Hollande”;
t [0] .goodAnswer = 0;

// Podría escribir esto en una función llamada initQuestions () por ejemplo

Entonces deberías escribir una función que haga una pregunta:

/ * Este es solo el prototipo, solo tienes que usar lo que estaba en tu código * /
pregunta nula (prueba * t)

Al final, su código principal debería verse así:

int main () {
srand (tiempo (NULL)); // Init srand
prueba * t = initQuestions (); // Obtenga el conjunto de preguntas
int askQuestions [numberOfQuestions] // Inicia esta lista solo con ceros

// Iré con pseudocódigo ahora
mientras askQuestions contiene ceros do
r = nuevo número aleatorio
si askQuestions [r] es 0 entonces
askQuestion (t [r])
preguntaPregunta [r] = 1
terminara si
finMientras

endMain

La forma más simple que se me ocurre es guardarlo con índices y luego usar la función aleatoria en c con el rango que son sus índices. Genere el número aleatorio y la búsqueda del índice en la base de datos de preguntas y use la pregunta.

Hay alguna función aleatoria () en CI cree. Puede asignar números enteros (1, 2, … n – número de preguntas) a sus preguntas y seleccionarlas por números aleatorios devueltos por la función. No olvide que puede tener repeticiones de esas funciones (y no desea haber hecho preguntas dos veces en un subconjunto dado).