3

乱数を使用してオブジェクトが特別かどうかを判断するコードがあります。頻繁にリセットされる 4 つのオブジェクトのそれぞれでこのコードを使用します。

Random rand = new Random();

int i = rand.Next(1, 25);

if (i == 1)
{
    thiss.typer = "boulder";
    thiss.texture = Content.Load<Texture2D>("rock");
}
else if (i == 2)
{
    thiss.typer = "ice";
    thiss.texture = Content.Load<Texture2D>("ice");
}
else if (i == 3)
{
    thiss.typer = "bomb";
    thiss.texture = Content.Load<Texture2D>("bomb");
}
else
    thiss.typer = "normal";

しかし、このコードを実行するたびに、4 つのオブジェクトが作成され、そのうちの 1 つが特別になると、何らかの理由でそれらすべてが特別になります。このコードに何か問題がありますか?それとも、コードを明らかにするためにもっと多くのコードを表示する必要がありますか?

4

1 に答える 1

14

このようなことが起こる理由は 2 つ考えられます。

まず、誤ってオブジェクト間で参照を共有し、thiss.typer4 つのケースすべてで同じオブジェクトを参照している可能性があります。

第 2 に、おそらく作成する Random オブジェクトは同じシードを共有するため、rand.Next は 4 つのインスタンスすべてで同じ数を返します。引数を指定しない場合new Random()、シードは現在のシステム時刻に基づいています。立て続けに複数回実行すると、シードが同じになる可能性があります。

使用するたびに新しいオブジェクトを作成する代わりに、同じ Random オブジェクトを使用してみることができます。このようにして、不必要に多くのオブジェクトを作成することも回避できます。

于 2012-05-24T10:59:11.877 に答える