假设我有一个向量for(int i = 0; i < 6; i++) {
boolean selected = false;
while(!selected){
selected = true;
int numbers = random.nextInt(48) + 1;
for(int k = 0; k <= i; k++) {
if (table[k] == numbers) {
selected = false;
break;
}
}
if(selected){
table[i] = numbers;
}
}
}
(包含两个或多个元素):
V1
我可以使用函数V1 <- 1:10
对原始向量进行重新排序。但是,此功能不能确保新向量中的任何元素都与原始向量不在同一位置。例如:
sample
这将导致一个向量,其中两个元素与原始元素的位置相同:
set.seed(4)
V2 <- sample(V1)
我的问题是:是否可以生成随机向量以确保两个向量之间没有元素位于相同位置?
答案 0 :(得分:2)
您对向量中没有某些索引的要求是不能移位的,这意味着您不希望出现纯随机排列的情况。我能想到的最好的方法是使用sample
循环,直到找到每个元素都在移动的向量:
v1 <- 1:10
v1_perm <- v1
cnt <- 0
while (sum(v1 == v1_perm) > 0) {
v1_perm <- sample(v1)
cnt <- cnt + 1
}
v1
v1_perm
paste0("It took ", cnt, " tries to find a suitable vector")
[1] 1 2 3 4 5 6 7 8 9 10
[1] 3 10 4 7 8 1 6 2 5 9
[1] "It took 3 tries to find a suitable vector"
请注意,我已经实现了用移位值移位位置的要求。当然,这并不是严格意义上的,因为两个值可能相同。但是,假设所有条目都是唯一的,则检查值的零重叠等于索引的零重叠。