我有两个变量x
和y
。其中一个应具有从0
到721 - this.Width
的随机int值。另一个必须是值0
或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;
}
}
答案 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;
}
}
至少这种方式,无论你想要使用内部实现,它对你的应用程序的其余部分并不重要。我得到了Width
和Height
,只是为了避免要求它引用UI层。
答案 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;}