c# - 没有重复的随机字符串

标签 c# random no-duplicates

我正在尝试生成一个 16 个字符的随机字符串,其中没有重复的字符。我认为这不应该太难,但我被困住了。

我正在使用 2 种方法,一种用于生成 key ,另一种用于删除重复的字符。在 main 中,我创建了一个 while 循环以确保生成的字符串长度为 16 个字符。

我的逻辑有问题,因为它只生成了 16 个字符的字符串 有重复项。就是做不对。

代码:

public string RemoveDuplicates(string s)
{
    string newString = string.Empty;
    List<char> found = new List<char>();
    foreach (char c in s)
    {
        if (found.Contains(c))
            continue;

        newString += c.ToString();
        found.Add(c);
    }
    return newString;
}

public static string GetUniqueKey(int maxSize)
{
    char[] chars = new char[62];
    chars =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
    byte[] data = new byte[1];
    RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
    crypto.GetNonZeroBytes(data);
    data = new byte[maxSize];
    crypto.GetNonZeroBytes(data);
    StringBuilder result = new StringBuilder(maxSize);
    foreach (byte b in data)
    {
        result.Append(chars[b % (chars.Length)]);

    }
    return result.ToString();
}

string builder = "";

do
{                       

    builder = GetUniqueKey(16);
    RemoveDuplicates(builder);

    lblDir.Text = builder;
    Application.DoEvents();


} while (builder.Length != 16);

最佳答案

考虑实现 shuffle algorithm用它你可以用独特的字符打乱你的字符串,然后只选择前 16 个字符。

您可以就地执行此操作,方法是分配单个 StringBuffer,它将包含您的初始数据(“abc ....”),并仅使用 Durstenfeld 的算法版本来改变您的缓冲区,而不是返回前 16 个字符。

关于c# - 没有重复的随机字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15185369/

相关文章:

c# - 关于mssql和mysql中的select查询以及表名的保留关键字问题

javascript - 离开页面时从 Razor View 中的 session 中删除项目

c++ - 以变​​化的间隔生成随机整数

Java - 测试重复对象

jQuery 选择器仅获取每个值的第一次出现

JavaScript - 重复函数,列出一定范围内的 'n' 个随机数,不重复

c# - Asp .net core 更改密码需要重启应用程序

c# - 包含在创建查询后不起作用

c - 在多少个值之后 rand() 可能会重复一个双工模式?

javascript - 在页面上放置一个随机生成器脚本 - 它可以工作。添加另一个具有不同名称的名称 - 不起作用