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

时间:2015-01-11 09:22:32

标签: c# random methods

我正在开发一个程序,一次最多可生成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()方法。

1 个答案:

答案 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();
        }