If you want something that will provide your users with something that is relatively easy to remember, you can always use my PronouncablePasswords
class.
I originally wrote this as an experiment in generating random passwords that were pronounceable by the end-user, rather than being complete gobbledygook. Of course, this reduces the security of the password, but for your purposes it sounds like this would be sufficient.
The function simply alternates between a vowel and a consonant (with some rudimentary exception rules), with "weighting" on the letters chosen based upon their occurrence in the English language. Note that this is by no means perfect, but it does do "what is says on the tin"!
Code:
using System;
using System.Collections.Generic;
using System.Text;
namespace PronouncablePasswords
{
class PasswordGenerator
{
//string vowels = "aeiou";
//string consonants = "bcdfghjklmnprstvwxyz";
/*
The reason for the duplicate letters is to add "weighting" to certain letters to allow them more chance
of being randomly selected. This is due to the fact that certain letters in the English language are more
frequently used than others.
The breakdown of usage is as follows (from most frequent to least frequent):
1. E (7)
2. T (6)
3. A, O, N, R, I, S (5)
4. H (4)
5. D, L, F, C, M, U (3)
6. G, Y, P, W, B (2)
7. V, K, X, J, Q, Z (1)
*/
string vowels = "aaaaaeeeeeeeiiiiiooooouuu";
string consonants = "bbcccdddfffgghhhhjklllmmmnnnnnpprrrrrsssssttttttvwwxyyz";
string[] vowelafter = {"th", "ch", "sh", "qu"};
string[] consonantafter = { "oo", "ee" };
Random rnd = new Random();
public string GeneratePassword(int length)
{
string pass = "";
bool isvowel = false;
for (int i = 0; i < length; i++)
{
if (isvowel)
{
if (rnd.Next(0, 5) == 0 && i<(length-1))
{
pass += consonantafter[rnd.Next(0, consonantafter.Length)];
}
else
{
pass += vowels.Substring(rnd.Next(0, vowels.Length), 1);
}
}
else
{
if (rnd.Next(0, 5) == 0 && i<(length-1))
{
pass += vowelafter[rnd.Next(0, vowelafter.Length)];
}
else
{
pass += consonants.Substring(rnd.Next(0, consonants.Length), 1);
}
}
isvowel = !isvowel;
}
return pass;
}
}
}