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

c#用唯一的整型填充数组,没有Linq或ArrayLists;

想要用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;
}