c#阵列超时错误

时间:2017-08-27 03:47:06

标签: c# arrays

我遇到了困难,因为该程序似乎有效但却停留在开发和显示最终数组上。它应该有45个元素,每个数字为1 - 45,但是以随机顺序生成,没有重复。

    using System;

    namespace RandomArray
    {
        public class RandomArrayNoDuplicates
        {
            static Random rng = new Random();
            static int size = 45;
            static void Main()
            {
                int [] array = InitializeArrayWithNoDuplicates(size);
                DisplayArray(array);
                Console.ReadLine();
            }


            /// <summary>
            /// Creates an array with each element a unique integer
            /// between 1 and 45 inclusively.
            /// </summary>
            /// <param name="size"> length of the returned array < 45
            /// </param>
            /// <returns>an array of length "size" and each element is
            /// a unique integer between 1 and 45 inclusive </returns>
            public static int[] InitializeArrayWithNoDuplicates(int size)
            {
                int[] arr = new int[size];

                for (int i = 0; i < size; i++)
                {
                    int number = rng.Next(1, size + 1);
                    arr[i] = number;
                    if (i > 0)
                    {
                        for (int j = 0; j <= i; j++)
                        {
                            if (arr[j] == arr[i])
                            {

                                i = i - 1;

                            }
                            else if (arr[i] != arr[j])
                            {
                                arr[i] = number;
                            }
                        }
                    }
                }
                return arr;
            }
            public static void DisplayArray(int[] arr)
            {
                for (int x = 0; x < size; x++)
                {
                    Console.WriteLine(arr[x]);
                }
            }
        }
    }

在生成数组中的每个元素之后,应检查元素以检查重复项。关于更好地解决这个问题的提示?

4 个答案:

答案 0 :(得分:0)

数组中已有的数字越多,其中已经存在重复的可能性就越大。使用最后一个数字,实际上有44/45的机会获得重复。在最坏的情况下,你必须检查所有44个元素甚至找到重复。只有更多的数组元素才会变得更糟。

我只能重复Leonardos Advise:创建一个包含所需数字的数组。然后扰乱所述数字的顺序。我称之为&#34;彩票问题&#34;并且通常使用两个List(int),因为它是最直观的。我应该能够找到一些示例代码,因为我经常使用它来编写代码。

我jsut在记事本++中做了这个快速的模型代码。可能会混淆长度并计算或搞乱索引,但你应该得到要点。我希望:

&#13;
&#13;
List<int> input = new List<int>();
List<int> output;

//Initialise Input
for(int i = 0; i < 45; i++)
  input[i]=i;
 
//Shuffle the array into output
random rng = new Random();  

output = new List<int>(input.Lenght);

for(; input.Lenght > 0;){
  int index = rng.NextInt(input.Lenght);
  int value = input(index);
  input.remove(index);
  
  output.add(value);
}

//output is a fully randomized version of input now
&#13;
&#13;
&#13; 我最初用Java编写了这个代码,其中Remove()具有返回被删除元素的良好属性,使得循环内部成为一个衬里。

答案 1 :(得分:0)

是的,同意所有人的意见,生成随机数组比加扰排序数组要昂贵得多。因此,你应该采取加扰选项。

在这方面,请查看此链接Best way to randomize an array with .NET

答案 2 :(得分:0)

您可以使用Random而不是Scramble执行此操作,但您的逻辑有问题。在我的例子中,我构建了一个包含所有可能数字的数组,另一个包含bool,最初为false。每次我使用一个数字我设置习惯为真。然后,下次我将Random的范围减小一个,并从我的数字数组中取出第n个未使用的值。然后在最后(这非常多,你来的地方)最后一个值不是随机的 - 它只是最后一个可用的数字。

另一点,你必须随机播种,否则它根本不是随机的!

代码如下所示:

namespace RandomArray
{
    class RandomArrayNoDuplicates
    {
        static Random rng = new Random(DateTime.Now.Millisecond);
        static int size = 45;

        static void Main(string[] args)
        {
            int[] array = InitializeArrayWithNoDuplicates(size);
            DisplayArray(array);
            Console.ReadLine();
        }
        /// <summary>
        /// Creates an array with each element a unique integer
        /// between 1 and 45 inclusively.
        /// </summary>
        /// <param name="size"> length of the returned array < 45
        /// </param>
        /// <returns>an array of length "size" and each element is
        /// a unique integer between 1 and 45 inclusive </returns>
        public static int[] InitializeArrayWithNoDuplicates(int size)
        {
            int[] allNos = new int[size];
            bool[] used = new bool[size];

            for (int i = 0; i < size; i++)
            {
                allNos[i] = i + 1;
                used[i] = false;
            }

            int[] arr = new int[size];
            int max = size;

            for (int i = 0; i < size - 1; i++)
            {
                int number = rng.Next(0, max);
                int ptr = 0;
                for (int j = 0; j < size; j++)
                {
                    if (used[j])
                    {
                        ptr++;
                    }
                    else
                    {
                        if (j == number + ptr)
                        {
                            break;
                        }
                    }
                }
                arr[i] = allNos[number + ptr];
                used[number + ptr] = true;
                max--;
            }
            for (int i = 0; i < size; i++)
            {
                if (used[i] == false)
                {
                    arr[size - 1] = allNos[i];
                    break;
                }
            }

            return arr;
        }
        public static void DisplayArray(int[] arr)
        {
            for (int x = 0; x < size; x++)
            {
                Console.WriteLine(arr[x]);
            }
        }
    }
}

答案 3 :(得分:0)

谢谢,我一定错过了摘要中的简报。太直接尝试生成数组,然后在每个整数后实现它尝试生成1/45机会的数组。我应该能够在最后加扰阵列。