Si te encuentras con alguna parte que no entiendes nos puedes dejar un comentario y haremos todo lo necesario de ayudarte lo más rápido posible.
Solución:
El problema está aquí:
int[] numbers = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ;
Con esa declaración cada vez que se agrega un número en password
se toma como número ASCII, no como valor real. Entonces estás sumando números enteros del 48 al 57, lo que hace que resulte string más tiempo de lo esperado.
por ejemplo, cuando 6
se genera como un número aleatorio, está agregando algo como: ((int)'6').ToString()
en tu password
variable, lo que realmente agrega 54
en vez de 6
.
declarar que array como char[]
y funcionará bien.
En su lugar, podría probar este pequeño método.
public static string Random(int length)
try
byte[] result = new byte[length];
for (int index = 0; index < length; index++)
result[index] = (byte)new Random().Next(33, 126);
return System.Text.Encoding.ASCII.GetString(result);
catch (Exception ex)
throw new Exception(ex.Message, ex);
La única diferencia con esto es que también usará caracteres alfanuméricos, por ejemplo, puede generar cadenas como f6Dx3$5d£4hG7
eche un vistazo a www.asciitable.com y calcule el rango de caracteres que desea usar.
Para Nathan, esta es otra forma de hacerlo, si sabes exactamente qué personajes quieres...
public static string Random(int length)
string allowed = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
return new string(allowed
.OrderBy(o => Guid.NewGuid())
.Take(length)
.ToArray());
Aquí hay una ligera mejora en la respuesta de series0ne. Esa respuesta dio una contraseña con el mismo carácter. (p.ej %%%%%)
var random = new Random((int) DateTime.Now.Ticks);
try
var result = new byte[length];
for (var index = 0; index < length; index++)
result[index] = (byte) random.Next(33, 126);
return System.Text.Encoding.ASCII.GetString(result);
catch (Exception ex)
throw new Exception(ex.Message, ex);