0

オブジェクトのリストを使用して単純なシミュレーションを作成し、農家を表すために繰り返し計算を実行しようとしています。農民が持っている金額をランダムなパーセンテージで増やす方法が1つあり、各農民は$ 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());
        }

ただし、返される結果は、リストの最初のオブジェクトが繰り返されるだけです。デバッグ モードでプロセス全体をステップ実行すると問題なく動作しますが、実行するとオブジェクトが重複しているように見えます。

4

2 に答える 2

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);
    }
}
于 2013-04-21T01:15:02.980 に答える