Tengo un archivo de texto con pocas cientos líneas, la estructura es bastante simple.¿Lees una línea aleatoria de un archivo? C#
nombre apellido
tengo que escoger un nombre de la lista aleatoria apellido & del archivo.
Tengo un archivo de texto con pocas cientos líneas, la estructura es bastante simple.¿Lees una línea aleatoria de un archivo? C#
nombre apellido
tengo que escoger un nombre de la lista aleatoria apellido & del archivo.
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big
Random rand = new Random();
return lines[rand.Next(lines.Length)];
Otra opción (y tal vez mejor) es tener la primera línea del archivo contiene el número de registros en ella y entonces no tiene que leer todo el archivo.
+1: Odio que las personas respondan las preguntas que realmente puedo responder antes de que pueda, especialmente cuando usan exactamente el mismo código que :) –
Gracias, acabo de Lo averigué. Pero tu camino parece mejor. – crap
Eso funciona siempre que el archivo sea relativamente pequeño. He proporcionado una alternativa que le permite no tener que guardar todo el archivo en la memoria. – tvanfosson
Lea cada línea y lleve una cuenta, N, de las líneas que ha visto hasta ahora. Seleccione cada línea con probabilidad 1/N, es decir, siempre se elegirá la primera línea, la segunda línea se elegirá 1/2 veces para reemplazar la primera, la tercera 1/3 veces, ... De esta forma cada línea tiene una 1/N probabilidad de ser la línea seleccionada, solo tiene que leer el archivo una vez, y no necesita almacenar todo el archivo en la memoria en un momento dado.
Aquí hay una implementación que se puede adaptar a sus necesidades.
public string RandomLine(StreamReader reader)
{
string chosen = null;
int numberSeen = 0;
var rng = new Random();
while ((string line = reader.ReadLine()) != null)
{
if (rng.NextInt(++numberSeen) == 0)
{
chosen = line;
}
}
return chosen;
}
basa en un C implementation para la selección de un nodo de una lista arbitrariamente larga vinculado.
las matemáticas me parecen incorrectas. ¡No es la probabilidad de seleccionar la 1ª línea 1/n! para cuando llegues al final? –
Las matemáticas aquí son buenas y agradables :) –
@Itay: solo si crees en los comentarios: yo no. Pero, he sido engañado por la probabilidad antes. –
Publique lo que tiene ahora, por favor ... –