从类调用函数时出现问题

时间:2011-09-23 15:18:31

标签: c#

我有一个名为 Cleint 的类,因为我有一个函数,我想用一个函数的不同结果从Cleint做一个三实例,但结果是相同的,这是我的代码:< / p>

Programm.cs:

class Program
    {
        static void Main(string[] args)
        {
            Cleint B = new Cleint();
            Cleint k = new Cleint();
            Cleint S = new Cleint();
            Console.WriteLine(B.GenerateAddress());
            Console.WriteLine(k.GenerateAddress());
            Console.WriteLine(S.GenerateAddress());
            Console.ReadLine();


        }
    }

和Cleint.cs:

class Cleint
    {
        public string GenerateAddress()
        {
            var parts = new List<string>();
            Random random = new Random();
            for (int i = 0; i < 4; i++)
            {
                int newPart = random.Next(0, 255);
                parts.Add(newPart.ToString());
            }
            string address = string.Join(".", parts);
            p;
            return address;
        }
    }

谢谢你的帮助

3 个答案:

答案 0 :(得分:2)

问题在于您如何使用随机数生成 - 您在每种情况下都在创建Random的新实例。

有关详细信息,请参阅my article on random numbers,但基本上您应该为所有呼叫使用相同的Random实例。

假设您的课程不是多线程的,您可以将其更改为 Random中有Client字段,或者Random GenerateAddress中的参数。无论哪种方式,您都可以在Main中创建一个实例,并为所有三种情况传递对该实例的引用。

答案 1 :(得分:2)

Random不是随机的 - 它是伪随机的,默认构造函数使用当前时间作为序列的种子。

当快速连续调用时,此时间将相同且序列相同。

如果您只有一个线程(因为Random不是线程安全的),您可以使用静态字段来确保使用相同的Random实例:

class Cleint
{
    private static Random random = new Random();

    public string GenerateAddress()
    {
        var parts = new List<string>();
        for (int i = 0; i < 4; i++)
        {
            int newPart = random.Next(0, 255);
            parts.Add(newPart.ToString());
        }
        string address = string.Join(".", parts);

        return address;
    }
}

答案 2 :(得分:1)

当您创建一个新的Random对象时,它会使用PC上的当前时间作为其生成器的种子。如果您快速连续创建许多Random对象,它们将生成相同的“随机”数字。

尝试创建单个Random对象并从中生成。