2013-09-27 67 views
1

因此,試圖模擬一個投擲硬幣遊戲,如果你得到的是正面,而你有兩倍的錢,如果你有故事,就可以得到一半。並想看看你拋出後,如果你從X錢開始,你會得到什麼R硬幣折騰遊戲

但是我不知道如何以一個很好的乾淨的方式解決這個問題,而不只是做一個forloop n。

有沒有一些乾淨的方法來做到這一點?

+2

如何使用'sample'? –

+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_prod將靠攏1,爲一個公平的硬幣(其中sample是)。

+0

cumulative_prod不會收斂到1!簡單隨機遊走收斂於正態分佈。由於您正在乘法而不是加法,因此cumulative_prod將收斂於分佈爲以1爲中心的對數正態分佈。 – shadow

+0

在這裏,我們正在討論一些語義,在上面的文本中,我指的是「收斂到1」,因爲期望值等於1.我認爲對於這個小例子來說,保持這種狀態就足夠了,而不會迷失在統計術語中。 –

+0

這很好。我只是指出,如果你使用不公平的硬幣,例如'樣本(c(0.5,2),Nsims,replace = TRUE,prob = c(.51,.49))',那麼產品收斂到0 a.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(0.5, 2), 100, replace = TRUE)而不是sample(c("H", "T"), N, TRUE),看到@保羅Hiemstra答案。

1

如果你已經開始瞭解這類事情,我會試圖在日誌空間中工作,即爲勝利添加一個,爲損失減去一個。你可以像其他人一樣sample,即@ Paul的答案。

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

這看起來非常相似,但y軸將在獎金:

y <- sample(c(-1,1), 100, replace=TRUE) 
plot(cumsum(y), type="s") 
如果你想轉換回「獎金」你可以做

如果您是像這樣的隨機過程的新手,可以看到很多「勝利」或「失敗」條紋。如果你想看看他們是怎麼長,rle功能可以在這裏很有用,例如:

table(rle(y)$len) 

將打印這些遊程的長度,從而可以獲得令人驚訝的長的頻率。你可以用負二項分佈玩到看到這個來自:

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

雖然你可能需要用較大的樣品(即1000個樣本或更多)的工作,看看相同的「形狀」。