Cómo seleccionar aleatoriamente una palabra de un archivo que contiene 1,000 palabras (1 palabra por línea) y mostrarla en un programa C ++

Según su definición, una palabra == una línea, por lo que simplemente elige una línea al azar.
Ingenuamente, puede generar un número aleatorio nreads y luego leer líneas nreads y mantener la última línea. El siguiente código de ejemplo supone que su archivo contiene al menos 1,000 palabras (líneas):

#include
#include
#include
#include // std :: getline

int main ()
{
std :: random_device rd;
std :: mt19937 gen {rd ()};
// Para solo 1 línea, cualquier distribución debería funcionar bien
// (o incluso sin usar explícitamente uno). Pero si quieres,
// por ejemplo, selecciona aleatoriamente 2 líneas o incluso más líneas,
// debes elegir cuidadosamente la distribución para el resultado deseado.
std :: uniform_int_distribution dis {1, 1000};
int nreads = dis (gen);

std :: archivo ifstream {“input-filename”};
std :: línea de cadena;
while (nreads–) std :: getline (archivo, línea);

std :: cerr << línea << "\ n";
}

Ver también

  • Generación de números seudoaleatorios
  • std :: getline – cppreference.com
  • std :: basic_ifstream – cppreference.com

Supongo que es un archivo de texto. Codifíquelo de la siguiente manera:
Char * nombre de archivo;
Cin >> nombre de archivo;
Archivo Ifstream (nombre de archivo);
Char * palabra;
Int r = aleatorio (1001);
Int i = 0;
Para (; i <= r; i ++)
File.getline (palabra, 256, ‘\ n’);
Cout << palabra;
File.close ();

Genere un número aleatorio para usar como el número de línea para leer.
o lea todo como una matriz de cadenas y luego lea un número de matriz aleatorio.

Ps Si esas 1000 palabras se escribieron originalmente en el archivo de forma aleatoria, solo elija la primera. 😛

Ejemplo de código, suponiendo que no es un archivo de ancho fijo; si lo es, puede buscar el registro apropiado. Además, dado que especificó C ++, traté de hacer que esto dependiera de la menor sintaxis de C posible.

#include
#include
#include
#include
#include
usando el espacio de nombres estándar;
int main (nulo) {
elemento de cuerda;
int a = 1;
// Siembra el generador de números aleatorios: funciona sin esto
// pero siempre obtendrás la misma respuesta.
srand ((sin signo) tiempo (0));
// Rand devuelve un número entre 0 y RAND_MAX. Módulo
// la aritmética lo obtiene de 0 a 999, luego agregamos uno para obtener el correcto
// distancia.
int b = rand ()% 1000 + 1;
// abre un archivo
std :: fstream infile (“archivo.txt”);
// agarra una cadena de longitud arbitraria y repite hasta a == b
// luego da salida a la cadena.
while (infile >> item) {
if (a ++ == b) {
cout << item << endl;
}
}
}

Obviamente, hay varias mejoras de rendimiento que podrían hacerse dependiendo de su caso de uso.

Si necesita hacer esto más de una vez por ejecución, y la velocidad es importante, considere leer todo el archivo en una matriz de cadenas al inicio y luego seleccione un elemento de matriz aleatorio cada vez que necesite una palabra.

1. generar un número aleatorio entre 0 y 1000.
2. Use uno de los métodos para llegar a esa línea.
a. fseek (…)
si. Leer línea por línea
3. Leer datos y mostrar.

Genere un número aleatorio usando rand ().
Cargue todo el archivo en la memoria como una cadena.
Dividir el archivo usando strtok ().
Muestra la línea del número que elegiste antes.