使用它的前身数据连续创建对象

Consecutive object creation using it's predecessors data

我目前有一项学校作业,主要侧重于面向对象编程和使用集合。

我知道其中大部分是如何完成的,但是我似乎遇到了障碍: 我对我的程序进行了编码,使其生成 10 个对象,将它们放入 List<T> 中,然后将它们输出到 ListBox.

效果很好,但出于某种原因,每个对象都接收到相同的精确值,即使它们应该是(伪)随机的。

这是对象的 class(名为 Boom),包括它的构造函数:

public class Boom
{
    public static int aantalBomen = 0;
    public enum boomType { Naald, Loof }

    public boomType BoomType { get; set; }
    public int VolgNr { get; set; }

    private int aantalVogels;
    public int AantalVogels
    {
        get { return aantalVogels; }
        set
        {
            if (value >= 0 && value <= 10)
                aantalVogels = value; 
        }
    }

    public Eekhoorn Eekhoorn { get; set; }

    private int hoogte;
    public int Hoogte
    {
        get { return hoogte; }
        set 
        { 
            if (value >= 5 && value <= 10)
                hoogte = value; 
        }
    }

    public bool eekHoorn = false;

    public Boom()
    {
        aantalBomen++;
        VolgNr = aantalBomen;
        Random rnd = new Random();
        Hoogte = rnd.Next(5, 11);
        AantalVogels = rnd.Next(0, 11);
        BoomType = (boomType)Enum.GetValues(typeof(boomType)).GetValue(rnd.Next(0, Enum.GetValues(typeof(boomType)).Length));
    }

    public void MaakEekhoorn()
    {
        Eekhoorn = new Eekhoorn();
        eekHoorn = true;
        aantalVogels = (int)Math.Round((double)(aantalVogels / 2), 0);
    }
}

& 这是创建 10 个对象的循环:

public List<Boom> Bomen = new List<Boom>();
for (int i = 1; i <= 10;i++ )
{
    Bomen.Add(new Boom());
}

最后,我用来测试对象创建的代码:

for (int i = 0;i<10;i++)
{
    lstBomen.Items.Add("VolgNr: " + bos.Bomen[i].VolgNr.ToString() + " AantalVogels: " + bos.Bomen[i].AantalVogels.ToString() + " BoomType: " +
        bos.Bomen[i].BoomType.ToString() + " Hoogte: " + bos.Bomen[i].Hoogte.ToString());
}

我似乎无法弄清楚为什么我的代码一直为所有 10 个对象生成完全相同的值,导致输出如下:

如果您需要更多信息,关于代码或任何与程序执行相关的信息,请随时询问。

因为您总是使用相同的种子值,Random 将始终生成相同的序列。您可以将 i 传递给承包商并像这样更改它:

public Boom(int seed)
{
    ...
    Random rnd = new Random(i);
    ...
}

要在每次 运行 您的代码时获得不同的数字:

Random rnd = new Random();
public List<Boom> Bomen = new List<Boom>();
for (int i = 1; i <= 10;i++ )
{
    Bomen.Add(new Boom(rnd.Next()));
}

或者,只需将 rnd 传递给构造函数。