考生分配考场的简单实现
- 前言
- demo逻辑
- 代码实现
前言
前段时间有小学弟咨询我考生分配考场的逻辑该怎么做,简单讲解了一下,在这里顺便记录下
demo逻辑
1. 循环班级数组 A
2. 循环每班总座位 B
3. 在B中按照顺序给每个位置分配上 通过随机数取到的随机学号
4. 打印输出
PS:重点要保证3不能重复
代码实现
我做的是个非常简单的demo,班级个数和每班人数都是固定的。当然实际生活中可能不是固定的,就需要根据实际情况去优化了
@Test
public void test1126()
{
int banji = 10;//班级个数
int renShu = 50;//每班座位数
int renShuTotal = banji * renShu;//待分配座位总数
/**
* 生成随机的学号list,放在set里没有重复
* 实际情况:该元素应从数据库中查出,且不可能出现重复
*/
Set<String> xueHaoNoList = getXueHaoNo();
Map<Long,String>[] listMap = new Map[banji];//用来存放已生成的座位+学号
List<Long> s3 = new ArrayList<>();//用来存放不重复的随机数
for (int i = 1, index = banji; i<= index; i++)
{
Map<Long,String> map = new HashMap<>();//用来存放每个班的座位+学号
for (int j=1,index2=renShu; j<=index2;j++)
{
Long sss = getRandom(renShuTotal,s3);
long s2 = 0;
for(String xueHao : xueHaoNoList)
{
if (s2==sss)
{
map.put((long)j,xuehao);
}
s2++;
}
}
listMap[i-1]=map;
}
//输出确认
long i2 =1;
for(Map<Long,String> map : listMap)
{
System.err.println("第"+i2+"个班级的考生分配情况如下:");
System.err.println(map);
System.err.println("********************************************");
}
}
/**
* 获取500以内的随机数,这里用了递归,以保证不会重复
*/
private Long getRandom(int renShuTotal,List<Long> s3)
{
Long sss = (long)(Math.random()*renShuTotal);
if(s3.contains(sss))
{
sss= getRandom(renShuTotal,s3);
}else{
s3.add(sss);
}
return sss;
}
/**
*获取随机学号,*1000000000用来保证重复几率最小
*/
private Set<String> getXueHaoNo()
{
Set<String> xuehaoNoList = new HashSet<>();
for(int i = 0,index = 500; i<index;i++)
{
Long ss = (long)(Math.random()*1000000000);
xuehaoNoList.add(ss.toString());
}
return xuehaoNoList;
}