考试到要到了,有多个学校,每个学校班数不尽相同。需要将这些学生以学校为单位重新随机排顺序,要求就是校内尽量做到同班不相邻,在这一前提下再做到随机排位
基本思想是分三步:
第一步:把人数最多班(假设人数为n)的学生排在一数组(大小为2n)的奇数序号位置中(1,3,5……2n-1),偶数位置空出来(2,4,6……2n-2)供第二步使用,同时该班人数置为0
第二步:在剩下的班中找出人数最多的班:
1、如果人数也为n,则将这个班的学生随机填入上一数组的偶数位置(2、4、6……2n);
2、如果人数为n-1,则将这个班的学生随机填入上一数组的偶数位置(2、4、6……2n-2);
3、如果少于n-1,则还需要从其他班中再去找人,直到凑够n-1个人,再随机填入上一数组的偶数位置(2、4、6……2n-2);
4、如果凑不够n-1个人,则不能做到全部的同班不相邻,此时只能随机将所有学生填进上一数组的偶数位置(2、4、6……2n-2)即可。
5、再把此数组扩大一倍,将数据移入到偶数序号位置(2、4、6……2n),奇数序号位置空出来供第三步使用
第二步最重要,是保证最大限度同班不相邻的关键
第三步:1、把剩余班按班号顺序将学生随机填入数组的奇数位置(1,3,5……2n+1)。2、数组扩大一倍,将数据移入到偶数位置,奇数位置空出。
循环执行1、2直到每个班都填完,再把结果填入最终结果数组中
在生成随机位置时,由于第二步可能凑过人数,极端情况下有可能排出班号相邻的情况,故生成随机位置时,需要判断一下班号
通过这三步就能尽最大限度做到同班不相邻,且有随机性
原始表中A列为学校代码,B列为班号,此两列为排位置的依据。其余列内容只读写不识别,共使用了六列(即A列至F列),G列作为辅助列。
学校代码为数字。班级代码都是从1开始依次编号的数字
第一行为标题,第二行起为数据,无空行
Sub test()
Dim ar1(), ar2(), ar3(), ar4()
Application.ScreenUpdating = 0
'以下在辅助列G列(就此处用到他)填入随机数、排序,再以A列、B列来排序,以达到将所有班内的学生打乱顺序,学校集中、同班学生集中的目的
With ActiveSheet
rowscount = .Cells(65536, "a