c#对象复制列表
本文关键字:列表 复制 对象 | 更新日期: 2023-09-27 18:10:15
我正在尝试使用对象列表创建一个简单的模拟,并使其重复执行计算以表示农民。它有一种方法,以随机百分比增加农民的钱,每个农民从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());
}
然而,我得到的结果只是列表中重复的第一个对象。如果我在调试模式下逐步完成整个过程,它可以正常工作,但当我让它运行时,对象似乎是重复的。
From 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);
}
}
因为程序运行得非常快,而且我相信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);
}
}