如何在R语言中生成无连续重复值的随机整数及实现?
Hey there! Great call starting with that x[k+1] != x[k] intuition—let's turn that simple idea into working, practical R code. Below are a couple of straightforward approaches to generate random integers where no two consecutive values are identical:
1. Basic Loop Implementation (Follows Your Initial Logic)
This method directly maps to the x[k+1] != x[k] check you thought of, making it easy to follow step-by-step:
# Define your parameters first num_values <- 10 # How many integers you want min_num <- 1 # Minimum value in your range max_num <- 5 # Maximum value in your range # Handle edge case: if only one possible value exists, we can't avoid duplicates if (min_num == max_num) { stop("Error: Can't generate consecutive distinct values when min and max are the same!") } # Start with the first random integer result <- sample(min_num:max_num, 1) # Loop to build the rest of the sequence for (i in 2:num_values) { # Generate a candidate value candidate <- sample(min_num:max_num, 1) # Keep generating until it's not equal to the previous value while (candidate == result[i-1]) { candidate <- sample(min_num:max_num, 1) } # Add the valid candidate to our result result <- c(result, candidate) } # Check your final sequence print(result)
This approach is perfect for learning the logic behind the requirement—every new value is explicitly checked against the last one before being added. It works well for small to medium-sized sequences.
2. Vectorized Approach (Faster for Large Sequences)
If you need to generate a very long sequence, this method avoids repeated loops and is more efficient:
num_values <- 1000 # Large number example min_num <- 1 max_num <- 5 if (min_num == max_num) { stop("Error: Can't generate consecutive distinct values when min and max are the same!") } # Generate an initial random vector (might have consecutive duplicates) result <- sample(min_num:max_num, num_values, replace = TRUE) # Find positions where consecutive values match duplicate_positions <- which(result[-1] == result[-num_values]) # Fix duplicates until none remain while (length(duplicate_positions) > 0) { for (pos in duplicate_positions) { # Generate a value that's NOT equal to the previous one result[pos+1] <- sample(setdiff(min_num:max_num, result[pos]), 1) } # Recheck for any new duplicates created by fixes duplicate_positions <- which(result[-1] == result[-num_values]) } # Verify no consecutive duplicates exist all(result[-1] != result[-num_values]) # Should return TRUE
Here, we generate all values first, then fix any consecutive duplicates by replacing them with a valid alternative. The setdiff() function ensures we only pick values that don't match the previous entry, and we recheck until all duplicates are gone.
Quick Notes
- Both methods work with any integer range—just adjust
min_numandmax_numto fit your needs. - If your range only has 2 possible values (e.g., 1 and 2), the sequence will alternate between them, which is still valid (no consecutive duplicates).
内容的提问来源于stack exchange,提问作者user8818397

