matlab运⽤函数随机点名,matlab随机点名程序思路:
总共n个学⽣(对应学号从1到n);每次抽查m个学⽣的作业;
输⼊n和m。得到每次抽查的学号;
⽽每次抽查的学号分为两部分:⼀部分是上次抽查过的⼈中随机30%的学号;另⼀部分是为抽查过的⼈中70%的学号;
最后,将每次抽查的⼈数在matlab界⾯显⽰,同时分别输出到D盘下的不同的txt⽂件中。
注意事项:最多抽查次数为10次;
具体如下:
function homework()
clear;
fid=fopen('d:\01.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\02.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\03.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\04.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\05.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\06.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\07.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\08.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\09.txt','w');%覆盖txt中已有的数据
fclose(fid);
fid=fopen('d:\10.txt','w');%覆盖txt中已有的数据
fclose(fid);
%disp,显⽰输⼊提⽰或者为⽂字;
disp('--------随机点名程序----------');
n=input('请输⼊班级总⼈数:');
m=input('请输⼊每次抽检的⼈数:');
disp('根据输⼊的数据,如果要所有学号抽查完,需要抽检的次数是');
x=floor((n-m)/(m-round(0.3*m)))+2
disp('请按任意键继续')
pause
%总⼈数为n,代表最⼤的学号;并将所有学号组成⼀个数列Z,这个表达式很简练的⽣成了⼀个⾏矩阵;
z=1:n;
%k0为所有学号第⼀次随机排列后的数列.
k0=randperm(n);
%从数列k0中随机⽣成m个不重复的学号,作为第⼀次抽检的学号数列;
s1=z(k0(1:m));
%有了第1次随机⽣成的数列S1,要从总数列Z中排除掉这个元素并形成⼀个新的矩阵s10;
%setdiff表⽰从z和S1中挑选中不同的!因为上⾯重复了多次,所以和原始⼈数⽐较选出不同的可以消去重复。
s10=setdiff(z,s1);%所有学号z中去掉已经抽取的s1学号,得到剩余的未抽取的学号;
%====================
disp('【第1次抽检的学号如下】');
disp('*********************************************************')
s1
disp('*********************************************************')
%====================
disp('---------第1次抽查后剩余的学号如下----------');s10
%下⾯是将s1输出到D盘1.txt⽂件中
[row,col]=size(s1);
fid=fopen('d:\01.txt','wt');
for i=1:row
for j=1:col
fprintf(fid,'.0f\n',s1(i,j));
end
fprintf(fid,'\n');
end
fclose(fid);
%==第2次抽查过程==================
%表⽰从s1(即第⼀次从z中抽出数量)中随机取30%(⽤round(0.3*m)表⽰数量);从s10(剩余学号)中随机取剩下的。
matlab生成随机数
%注意,这⾥不是直接抽取,⽽是先⽣成数列序号的随机数,再⽤随机数序号表⽰出矩阵元,⽐如随机抽取5,8,1序列号,对应的位置的数据就被随机选中了。
k1=randperm(length(s1));k10=randperm(length(s10));
s130=s1(k1(1:round(0.3*m)));
if
length(s10)>(m-round(0.3*m))%如果剩余的学号s10的个数length(s10)⼤于70%m
s1070=s10(k10(1:(m-round(0.3*m))));%则从s10中随机抽取m-round(0.3*m)个学号。
s2=[s130,s1070];%再将这m-round(0.3*m)个学号和从s1中抽取的30%的学号s130合并,得到第2次抽查的学号s20=setdiff(s10,s1070);%从第1次所有剩下的学号(S10)中减去S1070(它是从第1次剩余的s10中抽⾛的学号);disp('【第2次抽检的学号如下】');
disp('*********************************************************')
s2
disp('*********************************************************')
disp('---------第2次抽检后剩余的学号---------------');s20
%下⾯是将s1输出到D盘2.txt⽂件中
[row,col]=size(s2);
fid=fopen('d:\02.txt','wt') ;
for i=1:row
for j=1:col
fprintf(fid,'.0f\n',s2(i,j));
end
fprintf(fid,'\n');
end
fclose(fid);
%导出⽂件完毕
else
disp('【【【第2次抽检的学号】】】')
s10;
disp('已完成⼀次完整抽查。')
%下⾯是将s1输出到D盘txt⽂件中
[row,col]=size(s10);
fid=fopen('d:\02.txt','wt');
for i=1:row
for j=1:col
fprintf(fid,'.0f\n',s10(i,j));
end
fprintf(fid,'\n');
end
fclose(fid);
return
end
%==第3次抽查过程==================
k2=randperm(length(s2));k20=randperm(length(s20));
s230=s2(k2(1:round(0.3*m)));
if
length(s20)>(m-round(0.3*m))%如果剩余的学号s10的个数length(s10)⼤于70%m
s2070=s20(k20(1:(m-round(0.3*m))));%则从s10中随机抽取m-round(0.3*m)个学号。
s3=[s230,s2070];%再将这m-round(0.3*m)个学号和从s1中抽取的30%的学号s130合并,得到第2次抽查的学号s30=setdiff(s20,s2070);%从第1次所有剩下的学号(S10)中减去S1070(它是从第1次剩余的s10中抽⾛的学号);disp('【第3次抽检的学号如下】');
disp('*********************************************************')
s3
disp('*********************************************************')
disp('---------第3次抽检后剩余的学号----------------');s30
%下⾯是将s3输出到D盘3.txt⽂件中
[row,col]=size(s3);
fid=fopen('d:\03.txt','wt');
for i=1:row
for j=1:col
fprintf(fid,'.0f\n',s3(i,j));
end
fprintf(fid,'\n');
end
fclose(fid);
%导出⽂件完毕
else
%下⾯是将s1输出到D盘txt⽂件中
[row,col]=size(s20);
fid=fopen('d:\03.txt','wt');
for i=1:row
for j=1:col
fprintf(fid,'.0f\n',s20(i,j));
end
fprintf(fid,'\n');
end
fclose(fid);
%上⾯的txt⽂件导出结束
disp('----------第3次抽检的学号----------------')
s20;
disp('已完成⼀次完整抽查。')
return
end
%==第4次抽查过程==================
k3=randperm(length(s3));k30=randperm(length(s30));
s330=s2(k3(1:round(0.3*m)));
if
length(s30)>(m-round(0.3*m))%如果剩余的学号s10的个数length(s10)⼤于70%m
s3070=s30(k30(1:(m-round(0.3*m))));%则从s10中随机抽取m-round(0.3*m)个学号。
s4=[s330,s3070];%再将这m-round(0.3*m)个学号和从s1中抽取的30%的学号s130合并,得到第2次抽查的学号s40=setdiff(s30,s3070);%从第1次所有剩下的学号(S10)中减去S1070(它是从第1次剩余的s10中抽⾛的学号);disp('【第4次抽检的学号如下】');
disp('*********************************************************')
s4
disp('*********************************************************')
disp('---------------第4次抽检后剩余的学号-------------');s40
%下⾯是将s4输出到D盘4.txt⽂件中
[row,col]=size(s4);
fid=fopen('d:\04.txt','wt');
for i=1:row
for j=1:col
fprintf(fid,'.0f\n',s4(i,j));
end
fprintf(fid,'\n');
end