首页 新闻 会员 周边

数组问题,如何将一个数组中的元素随机分配到N个数组中

0
悬赏园豆:20 [已解决问题] 解决于 2014-07-07 17:32
现有数组a ,想将a中元素往N个数组中存放。要求是每次从a中取出n个元素,这n个元素乱序插入到n个数组中,这n个数组中每次只能放入一个元素,一直到a中元素分配完成。
比如说:
A:{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
n=5;
每次取5个元素,则得到:a1{1,2,3,4,5};a2{6,7,8,9,10};a3{11,12,13,14,15};将a1,a2,a3元素打乱顺序放入另外5个数组里,要求得到下面结果:
b:{3,8,14};
c:{4,6,12};
d:{2,10,11};
e:{1,7,15};
f:{5,9,13};
希望大家多指教,最好写段代码让我看下,我已经困惑好长时间了,写不出来;
c#
飞翔的球迷的主页 飞翔的球迷 | 初学一级 | 园豆:153
提问于:2014-06-26 15:14
< >
分享
最佳答案
0

随便写了一个

private static void _20140626f1()
        {
            Console.Write("数组A(输入长度后回车):");
            int maxlen = int.Parse(Console.ReadLine());
            List<int> a = new List<int>();
            for (int i = 0; i < maxlen; i++)
            {
                a.Add(i + 1);
            }
            
            Console.Write("取数n(输入后回车):");            
            int n = int.Parse(Console.ReadLine());            
            List<List<int>> b = new List<List<int>>();
            for (int i = 0; i < n; i++)
            {
                b.Add(new List<int>());
            }
            int tempn = maxlen % n == 0 ? maxlen / n : (maxlen / n + 1);
            for (int i = 0; i < tempn; i++)
            {
                List<int> c = new List<int>();
                for (int j = 0; j < n; j++)
                {
                    c.Add(j);
                }

                for (int j = i * n; j < (i + 1) * n; j++)
                {
                    if (j  < maxlen)
                    {
                        Random rd = new Random(i);
                        int temprd = rd.Next(0, c.Count);
                        if (temprd == c.Count) temprd -= 1;
                        int k = c[temprd];
                        while (b[k].Count > i)
                        {
                            temprd = rd.Next(0, c.Count);
                            if (temprd == c.Count) temprd -= 1;
                            k = c[temprd];
                        }
                        b[k].Add(j + 1);
                        c.Remove(k);
                    }
                }
            }
            for (int i = 0; i < n; i++)
            {
                Console.Write("数组" + (i + 1) + ":{");
                for (int j = 0; j < b[i].Count; j++)
                {
                    Console.Write(b[i][j]);
                    if (j + 1 < b[i].Count) Console.Write(",");
                }
                Console.WriteLine("}");
            }

        }

运行结果

收获园豆:20
飞来飞去 | 老鸟四级 |园豆:2057 | 2014-06-26 16:40
Random rd = new Random(j);

试了下,这样结果会更好看

飞来飞去 | 园豆:2057 (老鸟四级) | 2014-06-26 16:47

@飞来飞去: 就是这个,谢谢。我是卡在这了

 

 for (int i = 0; i < n; i++)
            {
                b.Add(new List<int>());
            }

飞翔的球迷 | 园豆:153 (初学一级) | 2014-06-26 17:03
其他回答(2)
0

//手打的可能会错,自己改

//每次取5个元素,则得到:a1{1,2,3,4,5} //从这里开始的

//先把a1中的5个数随机排列

Random rand = new Random();

for(int i = 0; i<= 5; i++)

{

  int r = rand.Next(5);

  int temp = a1[i];

  a1[i] = a1[r];

  a1[r] = temp;

}

//再把a1中的5个数依次放入b,c,d,e,f中就是随机的

b.Add(a[0]);

c.Add(a[1]);

//.......

//剩下的估计你能解决了

刘宏玺 | 园豆:14020 (专家六级) | 2014-06-26 15:40

如果N是个参数呢,我上面是我模拟的一个情况,如果N=3,那每个数组就是5了,我现在是不知道该怎么设计这N个数组,用什么数据结构。随机这块我能写出来,就是下面的不会了

支持(0) 反对(0) 飞翔的球迷 | 园豆:153 (初学一级) | 2014-06-26 16:04

@飞翔的球迷: 

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

for(int i = 0; i< N; i++)

{

  list.Add(new List<int>());

}

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2014-06-26 16:09
0

是的,N数组就是二维数组..

随机数对N取余,就是数组编号了.

吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-26 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册