-, :
mysample <- function(n, lower, upper, space) {
b <- ceiling((upper - lower + 1) / (space - 1))
bs <- sample(seq(2, b - 1, by = 2), n - 1)
gr <- split(setdiff(1:b,bs), cumsum(c(0, diff(setdiff(1:b, bs))) != 1))
out <- sapply(gr, function(x) (x[1] - 1) * (space - 1) + ceiling(runif(1) * length(x) * (space - 1)))
out[n] <- min(out[n], upper)
out
}
set.seed(123)
min(replicate(min(diff(mysample(100, 1, 100000, 10))), n = 1000))
mysample , , , sample(mysample(...)).
, [, ] space - 1 n-1 2-, 4-, 6-,... ; "" , . "" , , 1, 2, 5; (1- 2-, 5-), , . , .
:
set.seed(123)
upper <- 100000
benchmark(
mysample(100, 1, upper, 10), MichaelChirico(100, 1, upper, 10),
Grothendieck(100, 1, upper, 10), Jonathan(100, 1, upper, 10),
replications = 1, columns = c("test", "relative"))
upper <- 10000
benchmark(
mysample(100, 1, upper, 10), MichaelChirico(100, 1, upper, 10),
Grothendieck(100, 1, upper, 10), Jonathan(100, 1, upper, 10),
replications = 1, columns = c("test", "relative"))
MichaelChirico <- function(n, lower, upper, space) {
include <- lower:upper
smpl <- integer(n)
for (i in 1:length(smpl)){
smpl[i] <- si <- sample(include, 1)
include <- setdiff(include, (si - space):(si + space))
}
smpl
}
Grothendieck <- function(n, lower, upper, space) {
repeat {
s <- sample(lower:upper, n)
mindiff <- min(diff(sort(s)))
if (mindiff >= space) break
}
s
}
Jonathan <- function(n, lower, upper, space) {
min_gap <- space
samp_vec <- sample(seq(lower,upper,1), 1)
for (isamp in 1:n) {
possible_new_value <- samp_vec[1]
while(any(abs(samp_vec - possible_new_value) < min_gap)) {
possible_new_value <- sample(seq(lower,upper,1), 1)
}
samp_vec <- c(samp_vec, possible_new_value)
}
samp_vec
}