随笔 - 317, 文章 - 0, 评论 - 453, 阅读 - 114万
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

C# 生成不重复随机字符串 (1秒内生成1000000个)

Posted on   PHP-张工  阅读(15668)  评论(1编辑  收藏  举报

生成不重复随机字符串

生成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 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示