它是Visual Studio 2012中的错误还是我做错了什么?

时间:2013-12-30 22:42:25

标签: c# visual-studio-2012 random

我正在编写生成30000个不同字母数字代码的小程序,我希望程序每次可被1000整除时打印已生成代码的计数。 当我运行它时,它不像

那样打印它
1000
2000
3000

等等。而是像这样打印它

当我踏入并逐步前进时,它不会发生。 以下是代码

static void Main(string[] args)
    {
        char[] charSequence = { '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y' };

        Console.WriteLine(charSequence.Length);
        HashSet<string> set = new HashSet<string>();
        while (set.Count < 30000)
        {
            CodeGenerator cg = new CodeGenerator();
            Random rnd = new Random();
            string code = "";
            for (int i = 0; i < 8; i++)
            {
                int charSequenceNumber = rnd.Next(charSequence.Length);
                code += charSequence[charSequenceNumber];
            }
            set.Add(code);
            if (set.Count % 1000 == 0)
            {
                Console.WriteLine(set.Count);
            }

        }
       Console.WriteLine();
        Console.ReadLine();
    }

我做错了吗?

1 个答案:

答案 0 :(得分:0)

假设你在集合中有28999个元素。你再添加一个,它得到29000,你打印它。下一轮,您将生成一个新代码。假设它已经存在于集合中。所以你试着添加它,但它没有添加。计数保持在29000.您再次打印。巴姆。又一次又一次。

解决方案:检查set.Add的返回值。它会告诉您元素是否已添加。如果不是,则不要打印任何东西。

是的,正如评论者指出的那样,不要在循环中创建Random实例。但它不是你问题的根源。即使您做了更好的随机数生成,也会发生重复,并且您的打印错误将持续存在。