2013-09-27 2 views
1

그래서 동전 던지기 게임을 시뮬레이션하려고합니다. 돈을 두 배로 늘리면 머리를 얻을 수 있고, 절반이 있다면 이야기가 있습니다. 그리고 x 돈으로 시작한다면 n이 던진 후에 얻을 수있는 것을보고 싶습니다.코인 토스 게임 in R

그러나이 문제를 좋은 방법으로 처리하는 방법은 모르겠지만 for 루프를 n으로하지 않아도됩니다.

이렇게하려면 몇 가지 방법이 있습니까?

+2

'샘플'사용은 어떻게됩니까? –

+0

그래, 'sample (c (0,1), n, replace = TRUE)'를 사용하여 내 번호를 얻을 수 있었다. 그리고'* 2 + 0.5'와 x를 곱하면됩니까? – Coolcrab

답변

7

sample을 사용하면 times 0.5times 2의 목록을 만들 수 있습니다.

sample_products = sample(c(0.5, 2), 100, replace = TRUE) 
> sample_products 
    [1] 0.5 2.0 0.5 2.0 2.0 0.5 2.0 0.5 2.0 2.0 0.5 0.5 0.5 0.5 2.0 2.0 0.5 0.5 
[19] 2.0 2.0 0.5 0.5 0.5 2.0 2.0 2.0 2.0 0.5 0.5 2.0 2.0 2.0 2.0 2.0 2.0 0.5 
[37] 2.0 2.0 2.0 0.5 2.0 2.0 0.5 0.5 0.5 2.0 0.5 2.0 2.0 0.5 2.0 2.0 2.0 2.0 
[55] 0.5 2.0 0.5 2.0 0.5 0.5 0.5 2.0 2.0 2.0 2.0 0.5 2.0 0.5 0.5 2.0 0.5 0.5 
[73] 0.5 2.0 0.5 0.5 0.5 2.0 2.0 0.5 2.0 0.5 0.5 0.5 2.0 2.0 2.0 2.0 0.5 0.5 
[91] 2.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 2.0 0.5 

및 해당 제품의 누적 효과를 얻을 수 :

cumulative_prod = prod(sample_products) 

을하고 시작 돈이 포함

start_money = 1000 
new_money = cumulative_prod * start_money 

큰 샘플링 크기에, cumulative_prod1으로 수렴 할 것이다하는 것으로, 공정한 동전 (어느 sample)입니다.

+0

cumulative_prod는 1로 수렴하지 않습니다! 간단한 무작위 걸음은 분포가 정규 분포로 수렴합니다. 덧셈 대신에 곱하기 때문에, cumulative_prod는 1을 중심으로하는 로그 정규 분포에 수렴 할 것입니다. – shadow

+0

위의 텍스트에서 Whe가 의미론을 좀 더 띄고 있습니다. 위의 텍스트에서 "converge to 1"은 기대 값 이 작은 예제에서는 통계 용어에서 길을 잃지 않고 유지하는 것으로 충분하다고 생각합니다. –

+0

좋습니다. 너가 부당한 동전을 사용할 경우, 나는 지적했다. (C (0.5,2), Nsims, = TRUE, prob = c (.51, .49))를 대체하면,이 예제는 0 s.s로 수렴하게된다. – shadow

3

당신이 돌이 여러 번 반복

n = 10 

toss <- round(runif(n),0) 
toss[toss == 0] = -1 
toss <- 2^toss 

Reduce(x = toss,'*') 
3

이 가장 좋은 방법은 (내가 할 수있는 더 나은 방법이 많이있다 확신), 그럼에도 불구하고, 당신이 할 수없는을 실행할 수있는 경우 매우 시작 지점으로 그것을 고려하는 것은

> set.seed(1) 
> x <- 100 # amount of money 
> N <- 10 #number of throws 
> TH <- sample(c("H", "T"), N, TRUE) # Heads or Tails, drawin "H" or "T" with same probability 
> sum(ifelse(TH=="H", 2*x, 0.5*x)) # final amount of money 
[1] 1100 

또한이 인수로 돈 x의 초기 anount과 시련의 수를받는 함수를 작성할 수하는 방법을 이해하는 N

,
> head.or.tails <- function(x, N){ 
    TH <- sample(c("H", "T"), N, TRUE) # Heads or Tails 
    sum(ifelse(TH=="H", 2*x, 0.5*x)) # final amount of money 
} 
> 
> set.seed(1) 
> head.or.tails(100, 10) 
[1] 1100 

ifelse 부분을 피하려면 sample(c("H", "T"), N, TRUE) 대신 sample(c(0.5, 2), 100, replace = TRUE)을 쓰고 @Paul Hiemstra answer를 참조하십시오.

1

이런 종류의 일로 머리를 쓰려면 로그 공간에서 작업해야합니다. 즉, 승리를 위해 하나를 추가하고 손실을 위해 하나를 빼는 것입니다. 다른 사람들처럼 @, 즉 폴의 대답을 할 수 있습니다.

y <- sample(c(-1,1), 100, replace=TRUE) 
plot(cumsum(y), type="s") 

당신은 당신이 단지 수 있습니다 '상금'로 다시 변환 할 경우 :

plot(2^cumsum(y)*start_money, type="s", log="y", xlab="Round", ylab="Winnings") 

이 매우 유사하지만, y 축이 상금에있을 것입니다.

이와 같은 확률 론적 과정을 처음 접한다면, "승리"또는 "잃는"줄무늬를 많이 볼 수 있습니다. 당신은 그들이 얼마나 오래보고 싶은 경우, rle 기능은 예를 들어, 여기에 유용 할 수 있습니다 :

table(rle(y)$len) 

은 놀라 울 정도로 긴 얻을 수있는 이러한 실행의 길이의 주파수를 인쇄합니다.당신은 아마 같은 "모양"을 참조하십시오 더 큰 샘플 (즉, 1000 개 샘플 이상)와 함께 작동해야하지만

plot(table(rle(y)$len)/length(y)) 
points(1:15, dnbinom(1:15, 1, 0.5), col=2) 

: 당신이 어디에서 오는지 확인하기 위해 음 이항 분포와 함께 놀 수 있었다.