C#中给定数组元素的组合算法?

如何由A-Z,a-z,0-9等62个元素组成一个16位的字符串,要求相邻两位不能相同,且一个元素最多只能出现两次,而且出现两次的元素个数最多只能两个,请问这个算法要如何来写?

List result = new List(); //保存所有的可能字符 最终要的数据

List nunm = new List();//保存保存每一次可能字符数组形式

public void Index() //启动方法
{
List E = new List();
List e = new List();
int start = 65;
int end = 90;
while (start <= end) {
E.Add(((char)start).ToString());
e.Add(((char)start).ToString().ToLower());
start++;
}
List nums = new List();
for (int i = 1; i <= 9; i++) {
nums.Add(i.ToString());
}

        for (int i = 0; i < E.Count; i++) {
            nunm.Add(E[i]);
            functo(nunm);
            for (int j = 0; j < e.Count; j++)
            {
                nunm.Add(e[j]);
                functo(nunm);
                for (int k = 0; k < nums.Count; k++)
                {
                    nunm.Add(nums[k]);
                    functo(nunm);

                }
            }
        }
    }
              public void functo(List<string> nunm) {
        int count = 0;
        for (int a = 0; a < nunm.Count - 1; a++)
        {

            //相邻不相同
            if (nunm[a] == nunm[a + 1])
            {
                nunm.RemoveAt(nunm.Count - 1);
                break;
            }

            for (int b = a + 1; b < nunm.Count; b++)
            {
                int silcount = 0;

                if (String.Compare(nunm[a], nunm[b]) == 0)
                {
                    silcount++;
                }
                if (silcount > 3)
                {
                    nunm.RemoveAt(nunm.Count - 1);
                    return;
                }

                if (silcount > 0)
                {
                    count++;
                }

                if (count > 2) {
                    count = 0;
                    nunm.RemoveAt(nunm.Count - 1);
                    // nunm.Remove(nunm[nunm.Count - 1]);
                    return;
                }
            }
        }
        if (nunm.Count == 16)
        {
            string aa = "";
            foreach (var item in nunm)
            {
                aa += item;
            }
            result.Add(aa);
            nunm.RemoveAt(nunm.Count - 1);
            return;
        }
    }

随机组成还是遍历?遍历的话,这个组合数是一个天文数字。随机组合的话,你随机生成,然后根据你的规则判断,如果不符合重新生成直到符合就是了。

总觉得 少了点什么。。。。。

自己写了随机生成的一段代码,基本上能用,再对数据进行筛选下应该就勉强能用了。
public int Cd;
void Start () {
char[] Pwd;
Pwd = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray ();
string[] Mm;
Mm = new string[Cd];
char[] Ws;
Ws = new char[16;

    for (int k = 0; k < Cd; k++)
    {
        for (int i = 0; i < 16; i++)
        {
            int j = 0;
            j = Random.Range(0, 62);
            Ws[i] = Pwd[j];
        }
        Mm[k] = new string(Ws);


    }
    System.IO.File.WriteAllLines(@"D:/1234.txt", Mm);
    print("成功生成数据!");