我有一块4x4的电路板。我需要创建2个随机Point
变量,然后看看这些值之前没有被随机化。
我有2个Point
数组变量,名为Item1
和Item2
假设在第一个循环之后我有
Item1[0]
=(1,0)和Item2[0]
=(3,2) 在第二个循环中,我不应该得到(1,0)和(3,2)作为值
在第三个循环中,我不应该从第一个循环或第二个循环中获取项目
现在,对于即将到来的循环,我需要找到一种方法,以便不再选择上述项目!
我的代码:
Random rnd = new Random();
Point[] Item1 = new Point[8];
Point[] Item2 = new Point[8];
for (int x = 0; x < 8; x++)
{
//create coordinates for the first item
Item1[x].X = rnd.Next(8);
Item1[x].Y = rnd.Next(8);
//create coordinates for the second item
Item2[x].X = rnd.Next(8);
Item2[x].Y = rnd.Next(8);
}
我正在考虑创建List<Point>
并添加列表中的每个点。但我不知道如何检查列表中的所有项目,以及如何找到这些项目不匹配。
谢谢。
P.S。我想创建一个记忆游戏。这就是为什么我一次需要2分,这就是为什么重要的是我有独特的分数。
Random rnd = new Random();
Point[] Item1 = new Point[8];
Point[] Item2 = new Point[8];
List<Point> usedPoint = new List<Point>();
for (int x = 0; x < 8; x++)
{
do
{
Item1[x].X = rnd.Next(8);
Item1[x].Y = rnd.Next(8);
}
while(usedPoint.Contains(new Point(Item1[x].X,Item1[x].Y))== true);
usedPoint.Add(new Point(Item1[x].X,Item1[x].Y));
do
{
Item2[x].X = rnd.Next(8);
Item2[x].Y = rnd.Next(8);
}
while (usedPoint.Contains(new Point(Item2[x].X, Item2[x].Y))== true);
usedPoint.Add(new Point(Item2[x].X, Item2[x].Y));
}
答案 0 :(得分:2)
有几种方法可以解决您的问题。
如果点数越来越大,您应该考虑使用Hashtable来提高性能。
如果您想使用List<Point> list
,可以使用list.Contains(new Point(x,y))
检查此点是否存在。
此处有关List<T>.Contains
的更多参考资料:http://msdn.microsoft.com/en-us/library/bhkz42b3(v=vs.110).aspx
答案 1 :(得分:0)
你可以使用Hashset来提高性能 快速代码示例:您将需要类似的东西
var random = new Random();
var randomSet = new HashSet<int>();
const int size = 8 * 4; // 4 because for each coordinate and each item
for (int i = 0; i < size; i++)
{
var r = random.Next();
if (!randomSet.Contains(r)) {
randomSet.Add(r);
}
}
var uniqueRandowmNumbers = randomSet.ToArray();
int k = 0;
for (int x = 0; x < 8; x++)
{
//create coordinates for the first item
Item1[x].X = uniqueRandowmNumbers[k++];
Item1[x].Y = uniqueRandowmNumbers[k++];
//create coordinates for the second item
Item2[x].X = uniqueRandowmNumbers[k++];
Item2[x].Y = uniqueRandowmNumbers[k++];
}