考生分配考場的簡單實現

考生分配考場的簡單實現

前言

前段時間有小學弟諮詢我考生分配考場的邏輯該怎麼做,簡單講解了一下,在這裏順便記錄下

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;
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章