题目要求:
利用 runif 函数写一个随机点名的程序, 实现以下功能: 已知学生列表,输入学生个数, 随机输出指定个数的学生姓名。
- 不能使用 sample 函数
- 使用runif函数
- 避免重复点名
完整代码如下:
RandCall <- function(num){
i = 0
re = rep(0,num)
data<-read.csv('namelist.csv',sep=',',header=TRUE)
##data<-read.table('namelist.csv',sep=',',header=TRUE)
A<-as.matrix(data[,2:2])
while(i <= num){
x = ceiling(runif(1,min = 0, max =length(A)))
if(xor(is.element(A[x],re),TRUE)){
re[i] = A[x]
i = i + 1
}
}
return(re)
}
具体代码说明如下:
data<-read.csv('namelist.csv',sep=',',header=TRUE)
##data<-read.table('namelist.csv',sep=',',header=TRUE)
该步骤表示导入数据,文件名为“namelist.csv”,这里read.csv和read.table效果是一样的。sep 用来指定分隔数据的分隔符,header表示表的首行是否包含变量值的逻辑值。
A<-as.matrix(data[,2:2])
取出数据中第二列(姓名),并转化为矩阵A,方便后续输出。
x = ceiling(runif(1,min = 0, max =length(A)))
使用runif函数生成0-length(A)的随机数,这里用到ceiling向上取整函数,避免产生小数。
while(i <= num){
}
控制循环次数(点名人数)。
if(xor(is.element(A[x],re),TRUE)){
re[i] = A[x]
i = i + 1
}
is.element()函数用来判断新生成的A[x]是否属于re(是否与之前的重复),避免重复点名。这里用到异或运算符xor(),两值不等为真,两值相等为假。