c#用唯一的整型填充数组,没有Linq或ArrayLists;
本文关键字:Linq 没有 ArrayLists 数组 唯一 整型 填充 | 更新日期: 2023-09-27 18:14:22
这段代码有bug,但不知道为什么…想要用7个唯一的随机整数填充数组,而不使用数组列表或linq!我知道逻辑不对……
class Program
{
static void Main(string[] args)
{ int current;
int[] numbers = new int[7]; // size of that array
Random rNumber = new Random();
current = rNumber.Next(1, 50);
numbers[0] = current;
Console.WriteLine("current number is {0}", current);
for (int i=1;i<7;i++)
{
current = rNumber.Next(1, 50);
for (int j = 0; j < numbers.Length; j++)
{
do
{
if (current == numbers[j])
{
Console.WriteLine("Duplicate Found");
current = rNumber.Next(1, 50);
}
else
{
numbers[j++] = current;
break;
}
}while (current == numbers[j]);
}//inner for
}//outer for
for (int l = 0; l < 7; l++) // DISPLAY NUMBERS
{
Console.WriteLine(numbers[l]);
}
}// main
}//class
想要用7个唯一的整数填充一个数组,而不使用数组列表还是linq!
int[] list = new int[7];
for (int i = 0; i < list.Length; i++)
{
list[i] = i;
}
编辑
我改变了你的内部循环,如果随机数已经在数组中;创建一个新的随机,并将j重置为0。
for (int i = 1; i < 7; i++)
{
current = rNumber.Next(1, 50);
for (int j = 0; j < numbers.Length; j++)
{
if (current == numbers[j])
{
Console.WriteLine("Duplicate Found");
current = rNumber.Next(1, 50);
j = 0; // reset the index iterator
}
}//inner for
numbers[i] = current; // Store the unique random integer
}//outer for
我假设你正在寻找随机数,所以另一个答案不是你正在寻找的。
这里有几个问题。
-
内环正在测试副本。但是,由于它使用的是
numbers.length
,因此它是从0到数组末尾查找的。这可能应该是i
,以便与已经设置的值进行比较。numbers.length
总是7,无论你是否设置任何元素 -
赋值使用的是j,所以假设第一个元素不是重复的,它每次都会被覆盖。应该是
numbers[i] = current;
。不需要++,因为for
正在处理递增。 -
如果你确定一个数字是重复的,j应该被重置为zer,以再次检查整个列表,而不是在中间有while。
如果不完全重写,更改将看起来像这样:
for (int i=1;i<7;i++)
{
current = rNumber.Next(1, 50);
for (int j = 0; j < i; j++) //----------------- loop through set values
{
if (current == numbers[j])
{
Console.WriteLine("Duplicate Found");
current = rNumber.Next(1, 50);
j = 0; // -----------------------reset the counter to start over
}
}//inner for
// if we got here there is no duplicate --------------------------------
numbers[i] = current;
}//outer for
(请注意,我没有测试这段代码,只是添加了更改)
你在else语句中一直覆盖相同的索引,并且检查了太多的索引,导致第一个索引始终显示为重复,这是错误的…
改为:
for (int i=1;i<7;i++)
{
current = rNumber.Next(1, 50);
for (int j = 0; j < i; j++) ///< change to j < i. no need to check the others
{
do
{
if (current == numbers[j])
{
Console.WriteLine("Duplicate Found");
current = rNumber.Next(1, 50);
}
else
{
numbers[i] = current; ///< not j++ but i to prevent writing at the same locations over and over again
break;
}
}while (current == numbers[j]);
}//inner for
}//outer for
这个怎么样?
int[] list = new int[7];
var rn = new Random(Environment.TickCount);
for (int i = 0; i < 7; i++)
{
var next = rn.Next(1, 50);
while(Contains(list, next))
{
next = rn.Next(1, 50);
}
list[i] = next;
}
private bool Contains(IEnumerable<int> ints, int num)
{
foreach(var i in ints)
{
if(i = num) return true;
}
return false;
}