我正在编写生成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();
}
我做错了吗?
答案 0 :(得分:0)
假设你在集合中有28999个元素。你再添加一个,它得到29000,你打印它。下一轮,您将生成一个新代码。假设它已经存在于集合中。所以你试着添加它,但它没有添加。计数保持在29000.您再次打印。巴姆。又一次又一次。
解决方案:检查set.Add的返回值。它会告诉您元素是否已添加。如果不是,则不要打印任何东西。
是的,正如评论者指出的那样,不要在循环中创建Random实例。但它不是你问题的根源。即使您做了更好的随机数生成,也会发生重复,并且您的打印错误将持续存在。