问题描述
[size=13px]我在做一个随机分配考试的系统,里面有一个随机考试系统,需要达成的目标是这样的。首先呢,是有十二个固定的考场,100个人来参加考试。然后,这样进行:1、先随机把100个人打乱顺序;把12个考场也打乱顺序,也就是说不是1,2,3,4,5号考生进1,2,3,4,5考场,而是可能1号进5号考场,2号进4号考场,3号进7号考场这样子。2、挨个叫,叫到1号,1号进随机的一个考场考试,考完之后再随机选一个考场去考试,直到把12个考场轮转一圈,算是考完结束。3、以此类推。这个我想了很久,试了好多种方法,不是重复随机,就是无法实现,所以特求论坛里的各位大神教教我怎么实现这个功能?求核心代码……[/size]
解决方案
解决方案二:
是不是还漏掉什么
解决方案三:
每一个人的考试“历史”,作为每一个人的属性,要记录下分别进过哪些考场。这样你在分配“下一个考场”时就能够排除重复考场了。
解决方案四:
核心代码:int[]考生=Enumerable.Range(1,100).OrderBy(x=>Guid.NewGuid()).ToArray();
解决方案五:
只要学生乱序就可以了,具体代码上面已经有了,按guid排序,然后顺序排到教室就行了,一次随机和两次随机并没太大不同
解决方案六:
每一个学生考12次,不能重复进入同一个考场。
解决方案七:
而且,从lz的题目中,其实也没有说“所有的100个学生考完了一次,才统一分配下一个考场”。所以这个“分配下一个考场”的行为,实际上应该针对单个学生而设计。这样一个学生只要在一个考场考完了,他就可以提前进入下一个考场,而不用等着其它学生也考完。
解决方案八:
引用楼主qq_33824518的回复:
1、先随机把100个人打乱顺序;把12个考场也打乱顺序,也就是说不是1,2,3,4,5号考生进1,2,3,4,5考场,而是可能1号进5号考场,2号进4号考场,3号进7号考场这样子。2、挨个叫,叫到1号,1号进随机的一个考场考试,考完之后再随机选一个考场去考试,直到把12个考场轮转一圈,算是考完结束。3、以此类推。
你应该先画一个流程图,以便说明你的2步骤中是处理“挨个叫”和“进随机的一个考场”是如何取1步骤的结果的。实际上你在问题中提出的“试了好多种方法,不是重复随机,就是无法实现”,在你的2.描述中(最后半句话)一笔带过。这说明你的流程没有考虑清楚,连可操作性的描述都还不能写出来,就开始写代码了。因此你需要画一个流程图,先把你的问题到底在哪一步有问题(你并不是第一步有问题),说清楚。
解决方案九:
publicclassTested_List//考场以及对应得分{publicstringTest_Address_ID;//考场1,2,3,……12中的一个publicfloatTest_Score;}publicclassTester{publicstringTester_ID;//考生编号,1,2,3,……100中的一个publicList<Tested_List>Tested=newList<Tested_List>();//该考生已经考过的考场以及对应的得分publicTester(stringp_tester_id){Tester_ID=p_tester_id;}}……//定义公共工作listList<Tester>Tester_List;//初始化Tester_List=newList<Tester>();for(inti=1;i<=100;i++){Tester_List.Add(newTester(i.ToString()));}//开始叫号://根据他提供的编号,在Tester_List里查找对应元素temp_T;然后产生一个1,12之间的随机数,并且该随机数不能是在temp_T里已经存在的考场编号,如果temp_T中Tested数组长度达到了12,就退出,否则,把该随机数加入Tested,并通知考生去考试……
至于成绩,你需求里没说,应该是考完了自动写入
解决方案十:
总的意思是某一个考生考完了的考场以及成绩,要记录下来,以便在下一次抽取考场时参考,考过的就不要再去了