Hi, This might do what you want:
iter <- 0 repeat { iter <- iter + 1 ss <- numeric(40) ss[1] <- sample(1:40,1) for (i in 1:39) { ## calculate all possible step sizes that will give a new value in the 1:40 range pmove <- sample((1 - ss[i]):(40-ss[i])) ## drop all step sizes that puts the new value within 7 places of the previous value pmove <- pmove[abs(pmove)>7] ## calculate potential next values pss <- pmove + ss[i] ## flag any values that are already in the sample not.already.in <- !(pss%in%ss) found <- any(not.already.in) if (found) { ## use the first value that is not already in the sample ss[i+1] <- pss[not.already.in][1] } else { ## all potential values are already in the sample, so choose another starting point break } } if (found) break if (iter > 100) { cat("Giving up\n") break } } It randomly chooses a starting value, then chooses the next value based on a randomly selected step size rather than directly. It keeps doing this until it either uses all possible values, or gets stuck in which case it randomly selects another starting value. If it can't find a solution in 100 goes it gives up. Martyn -----Original Message----- From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On Behalf Of Hosack, Michael Sent: 22 March 2011 15:03 To: r-help@R-project.org Subject: [R] Infinite loop R experts, Hello, I am trying to sample a vector 1:40 without replacement such that no element in the new vector is within 7 units of either of its immediate neighbors. This is part of a larger program I am working on. The following code works well about 65 % of the time (14/40). The problem I encounter happens when the last element remaining to be sampled from the vector STRATA is within 7 digits +- of the last element in the vector s1, at which point an infinite loop occurs. At least that's what I think is happening. Any help would be greatly appreciated. Thank you, Mike require(IRanges) STRATA <- 1:40 s1 <- sample(STRATA, 1) for (i in seq(from = 1, to = 39, by = 1)){ repeat{ tmp <- sample(STRATA, 1) if (!any(s1 == tmp) & !any(as.vector(IRanges(s1[length(s1)]-7, s1[length(s1)]+7)) %in% tmp)) break } s1 <- c(s1,tmp) } s1 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. ________________________________________________________________________ This e-mail has been scanned for all viruses by Star.\ _...{{dropped:12}} ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.