2013-05-09 97 views
3

我有一點R的情況,我無法控制自己的頭。在R中創建'for'循環

據說這樣做的代碼應該只需要兩個或3線

我所要做的就是找出有多少10個變量的樣本必須採取之前,我所看到的每一個數字一次。

換句話說,有多少骰子的輥(在這種情況下,有10個面)採用我所見過的每一個側面

到目前爲止,我有東西沿着這些路線

param<-1:10 
    count<-0 
    seen<-0 
    for (i in 1:10) { 
     if (sample(param, size=1)==i); 
     if i in seen; 
      count+=1 
      seen+=1 
     elif count+=1 
    when seen==10 return(count) 
    } 

但這是Waaay太長了,我也知道它的格式是不正確的(很確定我試圖在某些點使用python代碼),但這是我第一次在R中完成循環。

任何幫助將非常感激!

是的,這是一個項目,但我想不出其他任何東西。 是的,我曾嘗試尋找的幫助其他問題/答案,但我的大腦只是一個懵懵懂懂現在

+2

您當前的代碼只滾動骰子10次,檢查每次不同的數字(我f它目前是第5次滾動,它只會檢查5)。如果你對python很熟悉,也許可以先寫出來,這樣你就可以確定你的邏輯是正確的。 – Marius 2013-05-09 05:04:24

+1

您可能會感興趣:http://math.stackexchange.com/questions/28905/expected-time-to-roll-all-1-through-6-on-a-die – thelatemail 2013-05-09 05:05:29

+0

我該如何做到這一點所以沒有特定的時間擲骰子?就像我的代碼試圖做的事情的整個點是找出它需要多少卷。所以我希望它停止,一旦我看到所有的值從1到10 – panderson 2013-05-09 06:06:36

回答

3

如果您正在尋找短代碼:

set.seed(1984) 

n = 10 
param = 1:n 
count = 0 

while(length(param) != 0){    ## stop when all numbers are seen 
param = setdiff(param, sample(1:n,1)) ## remove the element 
count = count + 1 
} 

count 

## 28 

編輯(略向量化的方法)

set.seed(1984) 

n = 10 
param = 1:n 
count = 0 

while(length(param) != 0){ 
    count = count + length(param) 
    param = setdiff(param, sample(1:n,length(param),replace=T)) 
} 

count 

## 28 

編輯2(多次運行)

set.seed(1984) 

n = 10 
num.runs = 5 
count = rep(0,5) 

for(i in 1:num.runs) 
{ 
    param = 1:n 
    while(length(param) != 0){ 
    count[i] = count[i] + length(param) 
    param = setdiff(param, sample(1:n,length(param),replace=T)) 
    } 
} 

count 

## 28 24 23 30 23 
+1

+1,雖然矢量化的解決方案會更酷:) – 2013-05-09 07:24:54

+0

謝謝@PaulHiemstra。我在想如果它可能矢量化一個循環運行可變次數(取決於種子)?編輯: – Nishanth 2013-05-09 07:40:54

+1

:基本上,如果我還沒有看到'3'號碼,那麼我一次抽樣'3'。所以在開始時'sample size = 10'。 – Nishanth 2013-05-09 08:28:52

3

您可以通過故意過採樣vectorise這個問題。在該示例中,創建長度1000的採樣向量,然後使用sapply找到的解決方案:

編輯,使用match而非sapply,通過@MadScone

set.seed(1984) 
n <- 10 

x <- sample(n, 1e3, replace=TRUE) 
max(match(1:n, x)) 
[1] 28 

如果所建議的要重複的實驗性功能,您可以使用replicate

do_experiment = function() { 
    n <- 10 
    x <- sample(n, 1e3, replace=TRUE) 
    return(max(match(1:n, x))) 
} 
replicate(100, do_experiment()) 
[1] 28 26 26 15 30 14 29 18 35 24 24 35 42 20 29 18 18 38 14 22 26 26 22 29 31 
[26] 51 14 35 26 19 40 22 23 19 28 15 27 20 16 18 20 19 18 37 24 38 37 54 29 19 
[51] 22 22 14 17 33 22 35 15 32 23 35 27 22 18 30 31 38 36 26 31 43 27 23 21 40 
[76] 25 36 21 39 27 55 28 36 15 48 31 32 46 28 21 40 23 46 24 31 30 25 21 24 20 
+0

+1,雖然我不會說這個解決方案是矢量化的,但使用'sapply'仍然是一個循環... – 2013-05-09 08:40:06

+0

不錯,但可能會失敗,因爲較大的'n'。甚至在極少數情況下也可能是'n = 10':) – Nishanth 2013-05-09 09:40:45

+0

@PaulHiemstra True。 – Andrie 2013-05-09 09:58:04