CD生成器无法正常工作

时间:2017-05-17 23:53:03

标签: c# linq

我的密钥生成器的输出对于密钥的每个部分都是相同的,即使我多次调用GetLetter会返回不同的结果。有任何想法吗?非常感谢。

输出(例如):B1J2-B1J2-B1J2-B1J2

    private void btn_generate_Click(object sender, EventArgs e) {
        txt_generate.Text = Generate();
    }

    public string Generate() {

        string[] code = new string[4];
        Random number = new Random();

        for (int i =0; i < 4; i++) {
             code[i] = GetLetter();
        }


        string code1 = code[0] + "-" + code[1] + "-" + code[2] + "-" + code[3];

        return code1;

    }

    public string GetLetter() {

        Random number = new Random();

        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        string newWord = "";

        for(int i = 0; i < 4; i++) {
            char temp = chars.ElementAt(number.Next(0, 36));

            newWord += temp.ToString();

        }

        return newWord;
    }
}

}

3 个答案:

答案 0 :(得分:1)

当你致电Random number = new Random();时,会创建一个新对象,并且随机播种一些值(通常是当前时间)。

只要您的代码执行得非常快,您就会创建此对象4次,但每次种子都相同。这就是为什么所有的块都是一样的。

您可以通过两种方式解决问题:

  1. number变量初始化移到方法之外,使其成为类的静态属性
  2. 生成所有16个字符,无需随机重新初始化,然后将最终字符串拆分为4个符号块

答案 1 :(得分:0)

为你重复一下:

private void btn_generate_Click(object sender, EventArgs e) {
    txt_generate.Text = Generate();
}

private static Random _random = new Random();

public string Generate() 
{
    return string.Join("-", Enumerable.Range(0, 4).Select(i => GetLetter()));
}

public string GetLetter() 
{
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    return new string(Enumerable.Range(0, 4).Select(i => chars[_random.Next(chars.Length)]).ToArray());
}

答案 2 :(得分:0)

问题来自每次致电RandomGetLetter时创建新的Generate个实例。相反,您应该在类中创建静态Random,例如。

static Random number = new Random();

private void btn_generate_Click(object sender, EventArgs e)
{
    txt_generate.Text = Generate();
}

public string Generate()
{

    string[] code = new string[4];
    for (int i = 0; i < 4; i++)
    {
        code[i] = GetLetter();
    }


    string code1 = code[0] + "-" + code[1] + "-" + code[2] + "-" + code[3];

    return code1;

}

public string GetLetter()
{
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    string newWord = "";

    for (int i = 0; i < 4; i++)
    {
        char temp = chars.ElementAt(number.Next(0, 36));

        newWord += temp.ToString();

    }

    return newWord;
}