考试随机座位表
记得期末考试田小远写了一个随机生成代码座位的小代码(JAVA),并且在全院每场考试中使用,给田小远点赞。当时我就在想可不可以用C试试,一直没有付诸行动,正好今天不想学习,就写一篇关于这的用C试试。。java我就是个渣渣...........
问题转化:班级人数以60为例,座位表—即产生60个不重复的随机数。(方案1:直接生成随即数且不重复(去重)。方案2:数按顺序生成,随机对两个数进行交换位置(次数尽可能多))
方案一:随机生成1到100的数,逐个保存到长度为60的数组中,每次保存时遍历前面已经保存的数,如果出现重复,则舍弃这个随机数,重新生成,再遍历。。直至把数组填满。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//终于意识到这种定义的方便性
#define M 60 // 班级总人数
#define line 6 //每一排坐几个人
//随机数生成函数
int randomNumber(){
return rand()%M+1;
}
int main(){
srand((unsigned)time(NULL));//生成随机数的种子
int a[M]={NULL};//初始化数组
int n=0;
while(n<M){
int m=randomNumber();
bool flag=0;
for(int j=0;j<n+1;j++){
if(a[j]==m){
flag=1;//如果之前保存的数中出现了和m相同的数,就把flag标记为1并跳出循环,表示需要重新生成随机数m
break;
}
}
if(flag==0){
a[n]=m;//如果flag是0,表示前n个数中没有和m相同的数,因此可以把第n+1个元素赋值为m
n++;
}
}
for(int k=0;k<M;k++)
{//输出数组
printf("%5d ",a[k]);
if((k+1)%5==0)
{
printf("\n");
}
}
printf("88888888888888888888888888888888\n对数组进行排序,检验数组是否正确!\n88888888888888888888888888888888\n");
for(int i=0;i<M;i++){//下面双重循环是一个快速实现的排序代码,用来检验之前生成的数组是否符合要求
for(int j=0;j<M;j++){
if(a[i]<a[j]){
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(int k=0;k<M;k++)
{//输出数组
printf("%5d ",a[k]);
if((k+1)%5==0)
{
printf("\n");
}
}
return 0;
}
方案2:问题等价于随机排列1到100,可以先把1到100用循环语句写进数组;然后进入一个很大的循环(循环次数越多越好),每次循环随机生成两个0到99的数,将这两个数为下标的元素对调,最后得到的就是随机排列的1到100了。因为对调数组的下标是随机生成。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand((unsigned int)time(NULL));
int studentNumber,line;
printf("请输入班级的人数:");scanf("%d",&studentNumber);
printf("请输入考场列数:");scanf("%d",&line);
int a[100];
for(int i=0;i<studentNumber;i++){
a[i]=i+1;
}
for(int j=0;j<1000;j++){
int m=rand()%studentNumber;
int n=rand()%studentNumber;
int k;
k=a[m];
a[m]=a[n];
a[n]=k;
}
for (int i=0;i<studentNumber;i++){
printf("%5d",a[i]);
if((i+1)%5==0)
{
printf("\n");
}
}
return 0;
}
时间原因留需求继续改进:如果说某一场考试几个学生表现不好,那么下一场考试要将他们排在指定位置,也就是说,可以指定位置。要么先指定,再排。要么就是先排好,再进行交换。——————图像化界面(指定)
田小远的Java代码如下:
//初始版本
package studyDemo;
import java.util.Scanner;
public class run {
public static void main(String[] args){
int n;//人数
int rank;//列数
int[] num=new int[100];//数组
Scanner scanf=new Scanner(System.in);
System.out.println("请输入班级人数");
n=scanf.nextInt();
System.out.println("请输入教室列数");
rank=scanf.nextInt();
for(int i=0;i<n;i++){
num[i]=i+1;
}
int j=n;//随机种子
int ran=0;//换行
for(int i=0;i<n;i++){
int number=(int)(Math.random()*j);
j--;
if(num[number]<10){
System.out.print("0"+num[number]+" ");
}else{
System.out.print(num[number]+" ");}
for(int q=number;q<n;q++){
num[q]=num[q+1];
}
ran++;
if(ran==rank){
ran=0;
System.out.println();
}
}
}
}
//改进版本
package studyDemo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
public class run {
public static void main(String[] args){
int n;//人数
int rank;//列数
String[] num=new String[110];//数组
for(int r=0;r<110;r++){
num[r]="01215";
}
Scanner scanf=new Scanner(System.in);
System.out.println("请输入班级人数");
n=scanf.nextInt();
System.out.println("请输入教室列数");
rank=scanf.nextInt();
String lineTxt = null;
try {
String encoding="GBK";
File file=new File("D:/Table/20165113080/test.txt");
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
num=lineTxt.split("-");
for(int i=0;i<5;i++){
System.out.println(num[i]);
}
}
read.close();
}else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
int j=n;//随机种子
int ran=0;//换行
for(int i=0;i<n;i++){
int number=(int)(Math.random()*j);
j--;
System.out.print(num[number].substring(num[number].length()-3,num[number].length())+" ");
for(int q=number;q<n;q++){
if(q!=n-1){
num[q]=num[q+1];}
}
ran++;
if(ran==rank){
ran=0;
System.out.println();
}
}
}
}