随机不好用

时间:2016-01-18 09:54:45

标签: c# algorithm random

我生成一个包含62个选项的字符串^ 6个字母= 56,800,235,584

但是在运行代码时,它会重复相同的字符串,少于每200,200次

这里有什么问题?

顺便说一句: 此代码基于答案here

class Program
{
    static void Main(string[] args)
    {
        var d = new Dictionary<string, bool>();

        for (int i = 0; ; i++)
        {
            var s = GenerateString(6);
            try
            {
                d.Add(s, false);
            }
            catch (Exception ex)
            {
                Console.WriteLine(String.Format("{0} - {1} - {2}", i, s, ex.Message));
                i = 0;
            }
        }

        Console.ReadKey();
    }


    static Random _rnd = new Random();
    public static string GenerateString(int len)
    {
        const string bigLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        const string smallLetters = "abcdefghijklmnopqrstuvwxyz";
        const string numbers = "1234567890";

        var validChars = bigLetters + smallLetters + numbers;

        var result = new StringBuilder();

        for (int i = 0; i < len; i++)
        {
            result.Append(validChars[_rnd.Next(validChars.Length)]);
        }

        return result.ToString();
    }
}

2 个答案:

答案 0 :(得分:6)

随机都可以。

问题与Birthday paradox有关。当你有200k项时,其中一项可以重复。

随机字符串并不保证始终是唯一的结果。要获得独特的结果,您应该使用 GUID

答案 1 :(得分:1)

为避免重复,您可以在将字符串添加到列表之前检查是否存在:

GenerateString()

中进行for循环
if(d.Contains(result.ToString()) // check whether the current generated string is in the list
 {
   GenerateString(len); // if it is already existed generate another one
 }
else
 { 
   return result.ToString(); // if not then return the string
 }