列表中的C#对象重复

时间:2013-04-21 01:02:24

标签: c# list random

我正在尝试使用对象列表创建一个简单的模拟,并使其重复执行计算以表示农民。它有一种方法可以增加农民的随机百分比,每个农民从100美元开始

    public class Farmer
    {
    public decimal money { get; set; }

    public Farmer()
    {
        money = 100;
    }

    public void doOneYear() //Represents how much money the farmer earned
    {
        Random random = new Random();
        decimal growth = random.Next(0, 100);
        decimal percentage = (growth / 1000);
        money = money * (1 + percentage);
    }
}

运行的代码是

        List<Farmer> farmers = new List<Farmer>();

        int count = 0;

        while (count < 10)
        {
            Farmer newFarmer = new Farmer();
            farmers.Add(newFarmer);
            count++;
        }


        foreach(var farmer in farmers)
        {
            int years = 0;
            while (years < 10)
            {
                farmer.doOneYear();
                years++;
            }
        }


        foreach (var farmer in farmers)
        {
            MessageBox.Show(farmer.money.ToString());
        }

然而,我得到的结果只是重复列表中的第一个对象。如果我在调试模式中逐步完成整个过程,它可以正常工作,但是当我让它运行时,对象似乎是重复的。

2 个答案:

答案 0 :(得分:1)

来自MSDN:“默认种子值是从系统时钟派生的,并且具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,并且因此,将生成相同的随机数集。“

我只是将Random实例设为静态成员,个人:

public class Farmer
{
    public decimal money { get; set; }
    private static Random random = new Random();

    public Farmer()
    {
        money = 100;
    }

    public void doOneYear() //Represents how much money the farmer earned
    {
        decimal growth = random.Next(0, 100);
        decimal percentage = (growth / 1000);
        money = money * (1 + percentage);
    }
}

答案 1 :(得分:0)

因为程序运行得如此之快,我相信Random类使用时间设置作为默认种子,你需要自己将种子注入Random调用。 (这也可能是为什么你在调试时会看到不同的数字 - 你使程序运行得更慢,因此Random类会输出不同的数字)。

我是这样做的,并且在输出中看到每个农民的不同数字。您可能希望使用不同的种子生成。

    public class Farmer
    {
        private static int seed = 17;

        public decimal money { get; set; }
        public int FarmerID { get; set; }
        public Farmer(int id)
        {
            money = 100;
            FarmerID = id;
        }

        public void doOneYear() //Represents how much money the farmer earned
        {
            seed++;
            Random random = new Random(seed);
            decimal growth = random.Next(0, 100);
            decimal percentage = (growth / 1000);
            money = money * (1 + percentage);
        }
    }