我想使用R生成n个唯一名称。这是我现在的代码:
library(randomNames)
set.seed(6232015)
gen.names <- function(n){
while(n>0){
names <- unique(randomNames(n=n))
n <- n - length(names)
names2 <- c(unique(randomNames(n=n)), names)
n <- n - length(names2)
}
return(names2)
}
nombres<- gen.names(n = 40000)
而不是40000我得到39999.如果我要求少于40000我得到那个号码。我的代码出了什么问题?
谢谢!
答案 0 :(得分:1)
您在第二次通话中获得了非唯一名称,导致姓名丢失。然后n计算被打破,允许你离开while循环。
让我们一起来看看:
names <- unique(randomNames(n=n))
n <- n - length(names)
你有38986个唯一的名字,n现在是1014
现在:
names2 <- c(unique(randomNames(n=n)), names)
n <- n - length(names2)
您有1013个新的唯一名称,在名称2中总名称为39999,n现在为1014 - 39999 = -38985
您点击循环结束,并在小于1时退出,并以1缺少名称返回您的值。
这是一个hacky解决方案,产生2000个额外名称,然后检查循环:
gen.names <- function(n){
names<-c()
while(length(names)<n){
names <- unique(c(randomNames(n=n+2000),names))
}
return(names[1:n])
}
答案 1 :(得分:0)
谢谢@jeremycg!
阅读完答案后,这是我的解决方案:
set.seed(6232015)
gen.names <- function(n){
names <- unique(randomNames(n=n))
need <- n - length(names)
while(need>0){
names <- unique(c(randomNames(n=need), names))
need <- n - length(names)
}
return(names)
}
nombres<- gen.names(n = 100000)