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

时间:2015-01-29 00:00:09

标签: c# oop loops random

我目前有一个学校作业,主要专注于面向对象编程&使用集合。

我知道大部分事情是如何完成的,但我似乎遇到了障碍: 我编写了我的程序,因此它生成10个对象,将它们放在List<T>&amp;然后将它们输出到 ListBox

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

这是对象的类(名为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个对象生成完全相同的值,从而产生如下输出:

Output

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

1 个答案:

答案 0 :(得分:2)

因为您始终使用相同的种子值,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传递给构造函数。