C# Random Password Generator

Problem is here:

int[] numbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

With that declaration every time a number is appended into password it is taken as ASCII number, not a real value. So you're adding integers from 48 to 57, what makes result string longer then expected.

e.g. when 6 is generated as a random number, you're appending something like: ((int)'6').ToString() into your password variable, what actually adds 54 instead of 6.

Declare that array as char[] and it will works fine.


You could try this little method instead instead.

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);
     }
}

The only difference with this is that it will use alphanumeric chars too, for example it may generate strings like f6Dx3$5d£4hG7

take a look at www.asciitable.com and work out the character range you want to use.

For Nathan, here is another way you could do it, if you know exactly which characters you want...

public static string Random(int length)
{
    string allowed = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    return new string(allowed
        .OrderBy(o => Guid.NewGuid())
        .Take(length)
        .ToArray());
}

Here is a slight improvement on the answer from series0ne. That answer gave a password with the same character. (e.g. %%%%%)

        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);
        }