1

2つの変数、xおよびを取得しyました。0これらの1つは、からまでのランダムなint値を持つ必要があります721 - this.Width。もう1つは、value0または。のいずれかである必要があります721 - this.Width。私はすでにこれを作成することができましたが、そのような長いコードはそのような小さなものにはばかげているようです。これが唯一の(または最良の)解決策である可能性がありますが、確かに、もっと短い方法はありますか?

これが私のコードです:

Random random = new Random();
int x, y;
if (random.Next(2) == 1)
{
    x = random.Next(721 - this.Width);
    if (random.Next(2) == 1)
    {
        y = 721 - this.Height;
    }
    else
    {
        y = 0;
    }
}
else
{
    y = random.Next(721 - this.Height);
    if (random.Next(2) == 1)
    {
        x = 721 - this.Width;
    }
    else
    {
        x = 0;
    }
}
4

4 に答える 4

2

あなたはそれをこのように書くことができます:

Random random = new Random();
int a = random.Next(2) * (721 - this.Width);
int b = random.Next(721 - this.Width);
int c = random.Next(2) * (721 - this.Height);
int d = random.Next(721 - this.Height);
int x, y;

Boolean t = (random.Next(2) == 1);
x = (t) ? a : b;
y = (t) ? d : c;

長いバージョンの方が理解しやすい場合は、このコードが自分のコードよりも優れているわけではないことに注意してください。コードを書く正しい方法はありません。理解しやすさは、簡潔さよりも価値があることがよくあります。

于 2013-02-22T23:18:22.790 に答える
1

必要な行数を減らしたい場合は、次のように実行できます。

Random random = new Random();
int x, y;
switch (random.Next(2))
{
    case 1:
        x = random.Next(721 - Width);
        y = random.Next(2) == 1 ? 721 - Height : 0;
        break;
    default:
        y = random.Next(721 - Height);
        x = random.Next(2) == 1 ? 721 - Width : 0;
        break;
}

クレジットはResharperに送られます。

于 2013-02-22T23:11:19.063 に答える
1

悪くないです。あなたができる最善のことは、複雑さを隠すためにそれを素敵なヘルパーユーティリティに移動することだと思います。random.Next(0, 1)おそらく、さまざまな結果を名前付きブール値に割り当てることができます。

public class PositionCalculator
{
    private Random random = new Random();

    public Point CalculatePosition(int width, int height)
    {
        int x, y;

        bool favourWidth = RandomBoolean();
        bool useZeroForOther = RandomBoolean();

        int favouredValue = random.Next(721 - (favourWidth ? width : height));
        int otherValue = useZeroForOther ? 0 : (721 - (favourWidth ? height : width));

        if (favourWidth)
        {
            x = favouredValue;
            y = otherValue;
        }   
        else
        {
            x = otherValue;
            y = favouredValue;
        }

        return new Point() { X = x, Y = y };
    }

    private bool RandomBoolean()
    {
        return random.Next(2) == 1;
    }
}

少なくともこの方法では、内部実装を試してみたい場合は、アプリケーションの他の部分には関係ありません。UIレイヤーへの参照が必要になるのを避けるために、これを取得しWidthて渡しました。Height

編集:実際、これでも、三項演算子で「論理」パスをたどるのは難しいと思います。何ヶ月/何年も後にアルゴリズムをもう一度見たときに、それを維持し、それでも理解するのに最も理にかなっているifまたはメソッド構造を自由に使用してください。

于 2013-02-22T23:12:16.700 に答える
0
var max = 721 - this.Width;
var rand = new Random();
var r = rand.Next(max * 2);
var x = r % max;
var y = (r / max) * max;
if (rand.Next(2) == 1) {var t = x; x = y; y = t;}
于 2013-02-22T23:23:11.043 に答える