前言
前段時間有小學弟諮詢我考生分配考場的邏輯該怎麼做,簡單講解了一下,在這裏順便記錄下
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;
}