生成随机字符串

Nik*_*mar 22 random r

我想以下列方式生成随机字符串:ABCDE1234E,即每个字符串包含5个字符,4个数字,然后是1个字符.

我想出了一种使用以下代码创建它的方法.

library(random)
string_5 <- as.vector(randomStrings(n=5000, len=5, digits=FALSE, upperalpha=TRUE,
                        loweralpha=FALSE, unique=TRUE, check=TRUE))
number_4 <- as.vector(randomNumbers(n=5000, min=1111, max=9999, col=5, base=10, check=TRUE))
string_1 <- as.vector(randomStrings(n=5000, len=1, digits=FALSE, upperalpha=TRUE,
                         loweralpha=FALSE, unique=FALSE, check=TRUE))
PAN.Number <- paste(string_5,number_4,string_1,sep = "")
Run Code Online (Sandbox Code Playgroud)

但是这些功能需要很长时间,而且random库需要网络连接.

> system.time(string_5 <- as.vector(randomStrings(n=5000, len=5, digits=FALSE, upperalpha=TRUE,
+                                                 loweralpha=FALSE, unique=TRUE, check=TRUE)))
   user  system elapsed 
   0.07    0.00    3.18 
Run Code Online (Sandbox Code Playgroud)

有什么方法可以尝试减少执行时间吗?我也尝试过使用,sample()但我无法理解.

A5C*_*2T1 27

使用@akrun建议的"stringi"会更快,但以下内容也非常快,不需要任何额外的包:

myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

myFun(10)
##  [1] "BZHOF3737P" "EPOWI0674X" "YYWEB2825M" "HQIXJ5187K" "IYIMB2578R"
##  [6] "YSGBG6609I" "OBLBL6409Q" "PUMAL5632D" "ABRAT4481L" "FNVEN7870Q"
Run Code Online (Sandbox Code Playgroud)


akr*_*run 19

我们可以使用stri_rand_stringsstringi

library(stringi)
sprintf("%s%s%s", stri_rand_strings(5, 5, '[A-Z]'),
      stri_rand_strings(5, 4, '[0-9]'), stri_rand_strings(5, 1, '[A-Z]'))
Run Code Online (Sandbox Code Playgroud)

或者更紧凑

do.call(paste0, Map(stri_rand_strings, n=5, length=c(5, 4, 1),
            pattern = c('[A-Z]', '[0-9]', '[A-Z]')))
Run Code Online (Sandbox Code Playgroud)

基准

system.time({
    do.call(paste0, Map(stri_rand_strings, n=5000, length=c(5, 4, 1),
            pattern = c('[A-Z]', '[0-9]', '[A-Z]')))
    })
#  user  system elapsed 
#   0      0      0
Run Code Online (Sandbox Code Playgroud)

使用OP的方法,即使对于预期输出的一部分,也能够重现时序

system.time(string_5 <- as.vector(randomStrings(n=5000, len=5, digits=FALSE, upperalpha=TRUE,
                                              loweralpha=FALSE, unique=TRUE, check=TRUE)))
#  user  system elapsed 
#   0.86    0.24    5.52 
Run Code Online (Sandbox Code Playgroud)


Sha*_*tal 5

您可以直接执行您想要的操作:样本随机5个大写字母样本4位数样本1个随机大写字母

digits = 0:9
createRandString<- function() {
  v = c(sample(LETTERS, 5, replace = TRUE),
        sample(digits, 4, replace = TRUE),
        sample(LETTERS, 1, replace = TRUE))
  return(paste0(v,collapse = ""))
}
Run Code Online (Sandbox Code Playgroud)

这将更容易控制,并且不会花费太长时间.

  • R对于大写字母也有一个内置常量("LETTERS"). (2认同)