c#从数组中移除重复项
本文关键字:数组 | 更新日期: 2023-09-27 18:16:04
int[] RandArray = new int[6];
Random randNumber = new Random();
for (int Counter = 0; Counter < RandArray.Length; Counter++)
{
RandArray[Counter] = randNumber.Next(1,50);
}
Console.WriteLine(RandArray[0]);
Console.WriteLine(RandArray[1]);
Console.WriteLine(RandArray[2]);
Console.WriteLine(RandArray[3]);
Console.WriteLine(RandArray[4]);
Console.WriteLine(RandArray[5]);
Console.ReadLine();
这个程序生成6个从1到49的随机数。目前,它会生成两次相同的数字。如何使它不重复任何数字?这个代码可以改进吗?
您可以使用HashSet来存储到目前为止生成的数字。HashSet只会添加新生成的数字,如果它不包含已经存在的数字。这样的:
Random rand_number = new Random();
HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < 6)
{
int new_number = rand_number.Next(1, 50);
numbers.Add(new_number);
}
如果你愿意,你可以使用List而不是HashSet,但是如果要生成的整数数量很大,HashSet的性能会好得多。
如果需要,可以在完成后将结果转换为数组,如下所示:
int[] integer_array = numbers.ToArray();
相反,如果您希望数字按升序排列,则可以这样做:
int[] integer_array = numbers.OrderBy(x => x).ToArray();
这回答了你的标题问题。
使用Distinct
LINQ操作符,它将删除重复的元素https://msdn.microsoft.com/en-us/library/vstudio/bb348436 (v = vs.100) . aspx
这回答了你的身体问题
为了不多次生成相同的数字,将数字存储在HashSet
中,并检查每次迭代是否之前生成了数字,并在需要时重新滚动
您可以创建从1到50的数字范围,然后将它们随机排序,然后从该范围中的6个组成一个列表:
var rnd = new Random();
var randomNumbers = Enumerable.Range(1,50).OrderBy(x => rnd.Next()).Take(6).ToList();
。NET Fiddle - https://dotnetfiddle.net/i06zCY
您可以检查您创建的每个数字是否重复:
int[] RandArray = new int[6];
Random randNumber = new Random();
for (int Counter = 0; Counter < RandArray.Length; Counter++) {
// Loop until you find an unused number
bool found;
do {
// Get a random number
int num = randNumber.Next(1,50);
// Look through the numbers picked so far
found = false;
for (int i = 0; i < Counter; i++) {
found |= num == RandArray[i];
}
// If the number was found go back and pick a new one
} while(found);
// Put the number in the array
RandArray[Counter] = num;
}
foreach (int n in RandArray) {
Console.WriteLine(n);
}
Console.ReadLine();