utilizar - propiedad random c#
generaciĆ³n de cadenas aleatorias: dos generadas una tras otra dan los mismos resultados (5)
El constructor predeterminado para Aleatorio (el que estás usando) siembra el generador con un valor basado en la hora actual. Si el tiempo en milisegundos no cambia entre la primera y la segunda llamada de la función, usaría la misma semilla aleatoria.
Mi sugerencia es usar un objeto aleatorio estático y solo inicializarlo una vez.
Tengo un código simple:
public string GenerateRandomString()
{
string randomString = string.Empty;
Random r = new Random();
for (int i = 0; i < length; i++)
randomString += chars[r.Next(chars.Length)];
return randomString;
}
Si llamo a esta función para generar dos cadenas, una tras otra, son idénticas ... pero si depuro a través de las dos líneas donde se generan las cadenas, los resultados son diferentes. ¿Alguien sabe por qué está sucediendo?
Es porque estás creando dos objetos aleatorios al mismo tiempo. Esto le da la misma semilla, por lo que obtendrá los mismos números.
Cuando lo depura, hay tiempo entre la creación de los objetos aleatorios que les permiten obtener diferentes semillas.
Esto está sucediendo, porque las llamadas suceden muy cerca una de la otra (durante el mismo milli-segundo), entonces el constructor Random sembrará el objeto Random con el mismo valor (usa la fecha y la hora de forma predeterminada).
Entonces, hay dos soluciones, en realidad.
1. Proporcione su propio valor inicial , que sería único cada vez que construya el objeto Aleatorio.
2. Siempre use el mismo objeto Aleatorio - solo contrólelo una vez.
Personalmente, utilizaría el segundo enfoque. Se puede hacer haciendo que el objeto Random sea estático o convertirlo en miembro de la clase.
Las respuestas anteriores son correctas. Sin embargo, sugeriría los siguientes cambios a tu código:
1) Sugeriría utilizar un StringBuilder en lugar de anexar a la cadena todo el tiempo. Las cadenas son inmutables, por lo que esto crea una nueva cadena cada vez que la agregue. Si nunca ha usado StringBuilder, búsquelo. Es muy útil para este tipo de trabajo.
2) Puede hacer que su método sea más fácil de reutilizar si pasa la longitud en el método mismo. Probablemente también puedas pasar el conjunto de caracteres, pero lo he dejado fuera.
3) Use el mismo objeto aleatorio cada vez, como se sugirió anteriormente.
public string GenerateRandomString(int length)
{
StringBuilder randomString = new StringBuilder(length);
for (int i = 0; i < length; i++)
randomString.Append(chars[(int)(_RandomObj.Next(chars.Length))].ToString());
return randomString.ToString();
}
Como el generador Random
está vinculado con el reloj del sistema, probablemente esté mostrando los mismos resultados con ese período de tiempo. Hay varias formas de corregir. Si está utilizando bucles, coloque el Random rnd = new Random();
fuera del circuito.
Coloque el Random rnd = new Random();
línea donde declaras tus variables y usas la misma variable en todo tu programa (rnd para este ejemplo).
Esto funcionará en la mayoría de los casos.