1

我有两个变量,xy。其中之一应具有从0to的随机 int 值721 - this.Width。另一个必须是 value0721 - 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;
    }
}

至少以这种方式,但是您想玩弄内部实现,这对您的应用程序的其余部分并不重要。我得到这个WidthHeight传入只是为了避免要求它具有对 UI 层的引用。

编辑:真的,即使这样,我仍然发现三元运算符很难遵循“逻辑”路径。随意使用对您最有意义的任何 ifs 或方法结构来维护它,并且当您在数月/数年后再次查看该算法时仍能理解它。

于 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 回答