C# 生成不重復隨機字符串 (1秒內生成1000000個)


生成不重復隨機字符串

生成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#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM