zoukankan      html  css  js  c++  java
  • C# 生成不重复随机字符串 (1秒内生成1000000个) PHP

    生成不重复随机字符串

    生成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;
    }
    

      

    源码下载:https://files.cnblogs.com/zjfree/randString.rar

    开发环境:WIN7 + VS2010 + .NET2.0 + C#

  • 相关阅读:
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-2019-结构体&文件
    C博客作业05--2019-指针
    C语言博客作业04--数组
    c语言博客作业03--函数
    C语言博客作业02--循环结构
    深入理解Java线程池原理
    Offer快到碗里来——聊聊线程池
  • 原文地址:https://www.cnblogs.com/zjfree/p/2751857.html
Copyright © 2011-2022 走看看