生成不重复随机字符串
生成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#
欢迎转载,转载请注明:转载自[ http://www.cnblogs.com/zjfree/ ]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具