C# 不同的随机函数都生成相同的值

C# Different random functions both generating the same value

我正在开发一个程序,可以一次生成最多 2 个有效的 IMEI 代码以进行移动 phone 测试。 尽管这 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() 方法。

默认种子值源自系统时钟,分辨率有限。因此,通过调用默认构造函数连续创建的不同 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();
        }