2013-05-09 4 views
3

У меня небольшая ситуация с R, из-за которой я не могу опустить голову.Создание цикла 'for' в R

Предположительно код для этого следует принимать только два или 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) 
    } 

но это слишком долго, также я знаю, что его форматирование неверно (я уверен, что я пытаюсь использовать код python в некоторых точках), но это первый раз, когда я сделал цикл в R.

Любая помощь приветствуется!

Да, это для проекта, но я ничего не могу придумать. да, я попробовал смотреть на другие вопросы/ответы на помощь, но мой мозг просто в путанице Теперь

+2

Ваш текущий код только бросает кости в 10 раз, и проверяет наличие различного числа каждый раз, когда я (f это в настоящее время пятый бросок, он будет проверять только 5). Если вы знакомы с python, возможно, сначала попробуйте записать его, так что вы уверены, что логика правильная. – Marius

+1

Это может вас заинтересовать: http://math.stackexchange.com/questions/28905/expected-time-to-roll-all-1-through-6-on-a-die – thelatemail

+0

Как это сделать? так что не существует определенного количества раз, чтобы бросить кости? как и весь смысл того, что мой код пытается сделать, - это выяснить, сколько рулонов требуется. поэтому я хочу, чтобы он остановился, как только Ive увидел все значения от одного до десяти. – panderson

ответ

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 

Edit (немного векторизованы подход)

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 

Edit 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, хотя векторизованное решение было бы намного круче :) –

+0

спасибо @PaulHiemstra. Я думал, возможно ли его векторизовать цикл, который выполняется переменное число раз (в зависимости от семени)? – Nishanth

+1

отредактировал: в принципе, если мне еще нужно увидеть цифры '3', тогда я пробую' 3' за раз. Итак, в начале 'sample size = 10'. – Nishanth

3

Вы можете проактивировать эту проблему путем преднамеренной передискретизации. В этом примере я создаю вектор выборки длины 1000, а затем использовать sapply, чтобы найти решение:

Отредактировано, чтобы использовать match, а не sapply, как это было предложено @MadScone

set.seed(1984) 
n <- 10 

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

И если вы хотите повторить experiement, вы можете использовать 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' по-прежнему представляет собой цикл ... –

+0

приятный, но может сбой для более крупных' n'. Или даже «n = 10» в редком случае :) – Nishanth

+0

@PaulHiemstra True. – Andrie

Смежные вопросы