我的密钥生成器的输出对于密钥的每个部分都是相同的,即使我多次调用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;
}
}
}
答案 0 :(得分:1)
当你致电Random number = new Random();
时,会创建一个新对象,并且随机播种一些值(通常是当前时间)。
只要您的代码执行得非常快,您就会创建此对象4次,但每次种子都相同。这就是为什么所有的块都是一样的。
您可以通过两种方式解决问题:
number
变量初始化移到方法之外,使其成为类的静态属性答案 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)
问题来自每次致电Random
和GetLetter
时创建新的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;
}