生成随机字母数字代码C#

Den*_*els 2 c# .net-4.0

我有一个方法可以随机生成字母数字组合.如果我在循环中调用它,它将返回相同的组合,但如果我放置一个断点GetVoucherNumber并逐步执行它,则每次都会生成一个不同的数字.你能解释一下为什么会这样,以及如何避免它?

码:

static void Main(string[] args)
{
    for (int i = 0; i < 100; i++)
        Console.WriteLine(GetVoucherNumber(6));

    Console.ReadLine();
}

public static string GetVoucherNumber(int length)
{
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var random = new Random();
    var result = new string(
        Enumerable.Repeat(chars, length)
                  .Select(s => s[random.Next(s.Length)])
                  .ToArray());

    return result;
}
Run Code Online (Sandbox Code Playgroud)

RB.*_*RB. 14

您的问题是您只创建一个Random实例.默认情况下,如果您不提供种子编号,则当前时间将用作种子.但是,您的代码执行速度如此之快,以至于同一时间被用作种子(因为您的代码执行速度比时钟的最小分辨率更快),因此您每次收到的数字都是相同的.

添加断点时,会在程序中添加延迟,以便为种子使用不同的时间.

最好的解决方法是只创建一个Random实例.random.Next然后每次调用将生成不同的数字.例如,您可以将代码更改为:

private static Random random = new Random();

public static string GetVoucherNumber(int length)
{
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var result = new string(
        Enumerable.Repeat(chars, length)
                  .Select(s => s[random.Next(s.Length)])
                  .ToArray());

    return result;
}
Run Code Online (Sandbox Code Playgroud)