生成不重復隨機字符串
生成1000000個用時不到1秒。
如果要生成6位隨機的不重復字符串,一般的想法是,使用Random生一個字符串,記錄到數組中,再生成一個如果不在數組中則插入。直到生夠數量。
但這樣效率會很低。對於6位隨機字符,數字+字母=36個字符。6位轉化為數字最大數為 36的6次方 = 2176782336。
只要生成小於最大數的隨機數,再轉化為字符串即可。
我的做法是,用最大數除以要生成的個數。得到一個遞增值X。
第一個隨機數在0-X之間。第二個在X-X*2之間。之后以此類推,這樣將避免了可能生成的隨機數重復。
然后再將隨機數轉化為指定長度的字符串。
但這樣生成的字符串數組會是順序的。所以再打亂數組順序輸出。
獲取隨機不重復字符串核心代碼
/// <summary> /// 獲取隨機字符串 /// </summary> /// <param name="len"></param> /// <param name="count"></param> /// <returns></returns> private List<string> GetRandString(int len, int count) { double max_value = Math.Pow(36, len); if (max_value > long.MaxValue) { ShowError(string.Format("Math.Pow(36, {0}) 超出 long最大值!", len)); return null; } long all_count = (long)max_value; long stepLong = all_count / count; if (stepLong > int.MaxValue) { ShowError(string.Format("stepLong ({0}) 超出 int最大值!", stepLong)); return null; } int step = (int)stepLong; if (step < 3) { ShowError("step 不能小於 3!"); return null; } long begin = 0; List<string> list = new List<string>(); Random rand = new Random(); while (true) { long value = rand.Next(1, step) + begin; begin += step; list.Add(GetChart(len, value)); if (list.Count == count) { break; } } list = SortByRandom(list); return list; }
將數字轉化為字符串
//數字+字母 private const string CHAR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /// <summary> /// 將數字轉化成字符串 /// </summary> /// <param name="len"></param> /// <param name="value"></param> /// <returns></returns> private string GetChart(int len, long value) { StringBuilder str = new StringBuilder(); while (true) { str.Append(CHAR[(int)(value % 36)]); value = value / 36; if (str.Length == len) { break; } } return str.ToString(); }
打亂數組順序
/// <summary> /// 隨機排序 /// </summary> /// <param name="charList"></param> /// <returns></returns> private List<string> SortByRandom(List<string> charList) { Random rand = new Random(); for (int i = 0; i < charList.Count; i++) { int index = rand.Next(0, charList.Count); string temp = charList[i]; charList[i] = charList[index]; charList[index] = temp; } return charList; }
源碼下載:http://files.cnblogs.com/zjfree/randString.rar
開發環境:WIN7 + VS2010 + .NET2.0 + C#