Top

考生分配考场的简单实现


前言

前段时间有小学弟咨询我考生分配考场的逻辑该怎么做,简单讲解了一下,在这里顺便记录下

demo逻辑

1
2
3
4
5
1. 循环班级数组  A
2. 循环每班总座位 B
3. 在B中按照顺序给每个位置分配上 通过随机数取到的随机学号
4. 打印输出
PS:重点要保证3不能重复

代码实现

我做的是个非常简单的demo,班级个数和每班人数都是固定的。当然实际生活中可能不是固定的,就需要根据实际情况去优化了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
@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;
}


未经允许不得转载: 幻凡ss » 考生分配考场的简单实现