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()方法。

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

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