我正在开发一个程序,一次最多可生成2个有效的IMEI代码,用于手机测试。 尽管对于2个代码中的每一个存在方法,但是程序总是为两者返回相同的值(例如,IMEI 1 = IMEI 2)。 以下是两种方法的示例(仅相关部分)。
IMEI 1:
public String IMEICode()
{
int[] code = new int[14];
Random generate = new Random();
int format = FormatCombo.SelectedIndex;
StringBuilder IMEI = new StringBuilder();
... //irrelevant
for (int i = 0; i < code.Length; i++)
{
code[i] = generate.Next(10);
}
... //irrelevant
return IMEI.ToString();
}
IMEI 2:
public String IMEICode2()
{
int[] code2 = new int[14];
Random generate2 = new Random();
int format = FormatCombo.SelectedIndex;
StringBuilder IMEI2 = new StringBuilder();
... //irrelevant
for (int i = 0; i < code2.Length; i++)
{
code2[i] = generate2.Next(10);
}
... //irrelevant
return IMEI2.ToString();
}
该程序有2个文本框,用于显示生成的代码(Field1和Field2),每个代码分配给一个方法(IMEICode()和IMEICode2())。
PS。:我确保第一个文本框显示IMEICode()方法,后者显示IMEICode2()方法。
答案 0 :(得分:4)
默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random
对象将具有相同的默认种子值,因此,将生成相同的随机集合编号即可。 使用单个随机对象生成所有随机数可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)
构造函数来解决此问题。 (来自MSDN)
对两种情况使用相同的Random
对象。
public static Random generate = new Random();
public String IMEICode()
{
int[] code = new int[14];
int format = FormatCombo.SelectedIndex;
StringBuilder IMEI = new StringBuilder();
... //irrelevant
for (int i = 0; i < code.Length; i++)
{
code[i] = generate.Next(10);
}
... //irrelevant
return IMEI.ToString();
}
public String IMEICode2()
{
int[] code2 = new int[14];
int format = FormatCombo.SelectedIndex;
StringBuilder IMEI2 = new StringBuilder();
... //irrelevant
for (int i = 0; i < code2.Length; i++)
{
code2[i] = generate2.Next(10);
}
... //irrelevant
return IMEI2.ToString();
}