随机字符串,没有重复

时间:2013-03-03 11:54:55

标签: c# random no-duplicates

我正在尝试使用NO DUPLICATE CHARS生成16个字符随机字符串。我觉得它不应该很难但我被卡住了。

我正在使用2种方法,一种用于生成密钥,另一种用于删除重复的字符。在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);

5 个答案:

答案 0 :(得分:8)

考虑实施shuffle algorithm,您将使用唯一字符对字符串进行随机播放,然后只选取前16个字符。

你可以通过分配包含你的初始数据(“abc ....”)的单个StringBuffer就地这样做,并且只使用Durstenfeld的算法版本来改变你的缓冲区,而不是先返回16个字符。

答案 1 :(得分:7)

有很多算法。

一个简单的方法是:

  1. 使用可用的字符填充一系列字符。
  2. 随机播放阵列。
  3. 取前N项(其中N是您需要的字符数)。
  4. 示例代码:

    using System;
    
    namespace ConsoleApplication2
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
                Random rng = new Random();
    
                for (int i = 0; i < 10; ++i)
                {
                    string randomString = RandomString(16, chars, rng);
                    Console.WriteLine(randomString);
                }
            }
    
            public static string RandomString(int n, char[] chars, Random rng)
            {
                Shuffle(chars, rng);
                return new string(chars, 0, n);
            }
    
            public static void Shuffle(char[] array, Random rng)
            {
                for (int n = array.Length; n > 1; )
                {
                    int k = rng.Next(n);
                    --n;
                    char temp = array[n];
                    array[n] = array[k];
                    array[k] = temp;
                }
            }
        }
    }
    

答案 2 :(得分:5)

const string chars = 
               "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
var r = new Random();
var s = new string(chars.OrderBy(x => r.Next()).Take(16).ToArray());

答案 3 :(得分:0)

我正在使用GUID生成方法,它本身会生成随机字符串,如果数字出现在开头,您可以修改它, 使用下面给出的代码:

string guid = System.Guid.NewGuid().ToString("N");
            while (char.IsDigit(guid[0]))
                guid = System.Guid.NewGuid().ToString("N");

希望有所帮助。

答案 4 :(得分:0)

看看这是否有帮助:

    RandomString()
    {
        string randomStr = Guid.NewGuid().ToString();
        randomStr = randomStr.Replace("-", "").Substring(0, 16);   
        Console.WriteLine(randomStr);
    }

返回字母数字字符串。