来自固定集合的随机序列,其包含每个字符中的至少一个

时间:2014-10-13 22:57:26

标签: r random sample

我正在尝试从包含每个字符中至少一个的固定数量的字符生成随机序列。

例如有合奏

m = letters[1:3]

我想创建一个N = 10个元素的序列,其中至少包含一个m个字符,例如

a
a
a
a
b
c
c
c
c
a

我尝试使用sample(n,N,replace=T),但这样也是一个像

这样的序列
a
a
a
a
a
c
c
c
c
a
可以生成不包含b

2 个答案:

答案 0 :(得分:8)

f <- function(x, n){
    sample(c(x, sample(m, n-length(x), replace=TRUE)))
}
f(letters[1:3], 5)
# [1] "a" "c" "a" "b" "a"
f(letters[1:3], 5)
# [1] "a" "a" "b" "b" "c"
f(letters[1:3], 5)
# [1] "a" "a" "b" "c" "a"
f(letters[1:3], 5)
# [1] "b" "c" "b" "c" "a"

答案 1 :(得分:5)

Josh O&Briens回答是一个很好的方法,但并没有提供太多的输入检查。既然我已经写过,它也可以提出我的答案。这几乎是一回事,但是要注意检查一些事情,比如只考虑独特的物品,并确保有足够的独特物品来保证每个物品至少有一个。

at_least_one_samp <- function(n, input){
  # Only consider unique items.
  items <- unique(input)

  unique_items_count <- length(items)
  if(unique_items_count > n){
    stop("Not enough unique items in input to give at least one of each")
  }

  # Get values for vector - force each item in at least once
  # then randomly select values to get the remaining.
  vals <- c(items, sample(items, n - unique_items_count, replace = TRUE))
  # Now shuffle them
  sample(vals)
}

m <- c("a", "b", "c")
at_least_one_samp(10, m)