C# 不同的随机函数都生成相同的值
本文关键字:函数 随机 | 更新日期: 2023-09-27 18:37:01
我正在开发一个程序,一次最多生成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个文本框来显示生成的代码(字段1和字段2),每个文本框分配给一个方法(IMEICode()和IMEICode2())。
PS.:我确保第一个文本框显示IMEICode()方法,后者显示IMEICode2()方法。
默认种子值派生自系统时钟,分辨率有限。因此,通过调用默认构造函数紧密连续创建的不同Random
对象将具有相同的默认种子值,因此将生成相同的随机数集。通过使用单个 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();
}