题目要求:

利用 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(),两值不等为真,两值相等为假。

 

更多推荐

R语言-随机点名程序(使用runif函数)