更简单的方法是让两个变量中的一个随机选择两个

本文关键字:两个 一个 随机 选择 变量 更简单 方法 | 更新日期: 2023-09-27 18:00:33

我得到了两个变量,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;
    }
}

更简单的方法是让两个变量中的一个随机选择两个

你可以这样写:

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;

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

如果你想让它占用更少的线路,那么你可以这样做:

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。

还不错。我认为你能做的最好的事情就是把它移到一个很好的辅助工具中来隐藏复杂性。也许您可以将各种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层。

编辑:真的,即使这样,我仍然发现三元运算符很难遵循"逻辑"路径。请随意使用任何对你来说最有意义的if或方法结构,以维护它,并在几个月/几年后再次查看算法时仍然理解它。

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;}