首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

1-50,随机排序.紧邻两个不能连续(即差的绝对值大于1)

2013-01-23 
1-50,随机排序.相邻两个不能连续(即差的绝对值大于1) int[] arr new int[50]Listint li new Listi

1-50,随机排序.相邻两个不能连续(即差的绝对值大于1)

 int[] arr = new int[50];
            List<int> li = new List<int>();
            for (int i = 1; i < 51; i++)
            {
                li.Add(i);
            }
            Random r = new Random();
            for (int i = 50; i > 0; i--)
            {
                int j = r.Next(0, i);
                if (i > 1 && i < 50 && Math.Abs(li[j] - arr[i]) < 2)
                {
                    i++;
                    continue;
                }
                else
                {
                    arr[i - 1] = li[j];
                    li.RemoveAt(j);
                }
            }

            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }
            Console.ReadLine();

我这写的在i==1的时候与前一位相差1判断不出来.
有没有比较严谨的办法?
[解决办法]
生成之后判断,连续的话再生成,如此反复
[解决办法]
引用:
引用:C# code?1234567891011121314         List<int> li = new List<int>();            Random r = new Random();            li.Add(r.Next(1,51));            while (li.Count < ……


你又没说不重复,,加个条件就可以了


List<int> li = new List<int>(); 


            Random r = new Random();
            li.Add(r.Next(1,51));
            while (li.Count < 50)
            {
                int n = r.Next(1,51);
                if (!li.Contains(n)&&li[li.Count - 1] - n > 1 
[解决办法]
 n - li[li.Count - 1]>1)
                li.Add(n);
            }
 
            for (int i = 0; i < li.Count; i++)
            {
                Console.WriteLine(li[i]);
            }


[解决办法]

        static void Main(string[] args)
        {
            int[] arr = new int[50];
            List<int> li = new List<int>();
            for (int i = 1; i < 51; i++)
            {
                li.Add(i);
            }
            Random r = new Random();
            int j;
            int f=0;
            while (li.Count > 0)
            {
                j = r.Next(0, li.Count - 1);
                if (f == 0)
                {
                    arr[f] = li[j];
                    li.RemoveAt(j);
                    f++;
                }
                else if (Math.Abs(li[j] - arr[f - 1])>1)


                {
                    arr[f] = li[j];
                    li.RemoveAt(j);
                    f++;
                }
            }

            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }
            Console.ReadLine();
        }
[解决办法]
从原来的数组里面提取数据,拿掉一个删掉一个,随即拿,满足条件的再拿(不相邻),拿完结束。随即排列完毕
[解决办法]

  var ary = Enumerable.Range(1, 50).ToArray();
            int count = 0;
            do
            {
                ary = ary.OrderBy(t => Guid.NewGuid()).ToArray();
                count++;
            }
            while (ary.Where((t, index) =>
            {
                if (index > 0 && Math.Abs(ary[index] - ary[index - 1]) == 1)
                    return true;
                else if (index < ary.Length - 1 && Math.Abs(ary[index + 1] - ary[index]) == 1)
                    return true;
                    return false;
            }).Count() > 0);
            ary.ToList().ForEach(t => Console.WriteLine(t));
           

[解决办法]
我看出是什么编程软件了........
[解决办法]
把arr改成List,当最后一个数不满足条件时,循环List,在相邻两个数和这个数差值大于2时,插进去就可以了。一定会有这两个数的,所以不会死循环了。

热点排行