更简单的方法是让两个变量之一随机拥有两个选项之一?

时间:2013-02-22 22:51:15

标签: c# random

我有两个变量xy。其中一个应具有从0721 - this.Width的随机int值。另一个必须是值0721 - 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 个答案:

答案 0 :(得分: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;

请注意,如果您发现更长版本更易于理解,则此代码并不比您的更好。没有正确的方式来编写代码,而且可理解性通常比简洁更有价值。

答案 1 :(得分: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。

答案 2 :(得分: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或方法结构最适合您维护它,并且从现在开始数月/年后再次查看算法时仍然可以理解它。

答案 3 :(得分: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;}