2015-02-26 2 views
1

Так что я сейчас пытаюсь получить случайный начальный путь между узлами. Я пробовал следующий код, но иногда он «пропускает» узел i, иногда один и тот же узел посещается дважды, а не пересекает каждый. Но так как я определил «столбец» посещенного узла как все 0, я не понимаю, почему это должно произойти при использовании команды (> 0). Любой совет?Для цикла и команды «which»

A<-matrix(sample(1:15,25,replace=TRUE), ncol=5) 

n=nrow(A) 

b=c() 
a=c(1:nrow(A)) 
b[1]=sample(a,1) 

for(i in 2:n){ 
A[,b[i-1]]<-rep(0,n) 
d=which(A[b[i-1],]>0) 
b[i]=sample(d,1) 
} 

print(b) 
+0

Почему бы просто не сделать 'образец (seq_len (Ncol (A)))', а затем вы получите путь между пятью колоннами, которые никогда не повторит столбец? Если вы хотите повторить, просто попробуйте 'sample (seq_len (ncol (A)), replace = TRUE)' – thelatemail

ответ

4

Проблема заключается в том, что образец ведет себя по-другому, когда вы передаёте вектор длины 1. Observe

set.seed(14) 
x<-c(5,3) 
sample(x, 1) 
# [1] 5 
x<-5 
sample(x, 1) 
# [1] 4 

вы видите, что образец возвращается 4. Когда вы передаете в векторе длины один, он рисует от 1: x. Вы можете написать свою собственную обертку, если хотите, а не использовать

Sample<-function(x,n) { 
    if(length(x)>1) 
     sample(x,n) 
    else if (length(x)==1 & n==1) { 
     x 
    } else { 
     stop("error") 
    } 
} 

, а затем используйте эту функцию.

Но, похоже, вы просто перетасовываете свои ряды. Почему не просто переставить индекс одним вызовом образца:

sample(seq_len(nrow(A)) 
Смежные вопросы