I never looked at the code before, but your method only produces a symbol at the end of the password string, and you shouldn't be using += as much as you should be using &= as password is a string here.
Try randomizing it a bit more, you also don't need the numbers or letter array:
Code:
Private Function GeneratePassword(Length As Integer) As String
If (Length < 5) Then Length = 5
Dim Symbols As String = "!£$%^&*(){}~@:;#?/>.<"
Dim Rand As New Random
Dim Password As String = String.Empty
While Password.Length < Length
Select Case Rand.Next(Password.Length) Mod (Password.Length + 1)
Case 0
Dim Letter As String = Convert.ToChar(Rand.Next(65, 65 + 26)).ToString
Select Case Password.Length Mod 2
Case 0
Password &= Letter.ToUpper
Case Else
Password &= Letter.ToLower
End Select
Case Else
Select Case Password.Length Mod 2
Case 0
Password &= Rand.Next(0, 10)
Case Else
Password &= Symbols.Substring(Rand.Next(0, Symbols.Length - 1), 1)
End Select
End Select
End While
Return Password
End Function
Here's the kind of passwords this would generate:
Code:
Ms0cF&K!5!
Jy4;Q%5£6?
OmPr9)5£1^
Rk6a8m4s4:
Cx7(W£1*8/
Oq0:3(5#4{
Td4)3/5~4r
PbXg3wV*Kc
Ki2nVq9#1{
WbOv2>4%7£
It8c6^9~4:
CbEj2.D!1$
Wj5@7#2)8n
Edit: I missed milopeach's answer too. Your "While True" is a bad misuse of the While loop as that's not what it's intended for, you could have just used the while expression to check the password length instead of making it a statement to check for to exit the loop.