因此,試圖模擬一個投擲硬幣遊戲,如果你得到的是正面,而你有兩倍的錢,如果你有故事,就可以得到一半。並想看看你拋出後,如果你從X錢開始,你會得到什麼R硬幣折騰遊戲
但是我不知道如何以一個很好的乾淨的方式解決這個問題,而不只是做一個forloop n。
有沒有一些乾淨的方法來做到這一點?
因此,試圖模擬一個投擲硬幣遊戲,如果你得到的是正面,而你有兩倍的錢,如果你有故事,就可以得到一半。並想看看你拋出後,如果你從X錢開始,你會得到什麼R硬幣折騰遊戲
但是我不知道如何以一個很好的乾淨的方式解決這個問題,而不只是做一個forloop n。
有沒有一些乾淨的方法來做到這一點?
您可以使用sample
創建一個列表times 0.5
和times 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
是)。
cumulative_prod不會收斂到1!簡單隨機遊走收斂於正態分佈。由於您正在乘法而不是加法,因此cumulative_prod將收斂於分佈爲以1爲中心的對數正態分佈。 – shadow
在這裏,我們正在討論一些語義,在上面的文本中,我指的是「收斂到1」,因爲期望值等於1.我認爲對於這個小例子來說,保持這種狀態就足夠了,而不會迷失在統計術語中。 –
這很好。我只是指出,如果你使用不公平的硬幣,例如'樣本(c(0.5,2),Nsims,replace = TRUE,prob = c(.51,.49))',那麼產品收斂到0 a.s.,這在考慮這個例子時可能很有趣。 – shadow
你可以遍歷這個,如果你想運行多個迭代
n = 10
toss <- round(runif(n),0)
toss[toss == 0] = -1
toss <- 2^toss
Reduce(x = toss,'*')
這是不是最好的方法(我敢肯定有很多更好的方法來做到這一點),但是,仍可以把它當作一個新起點,以瞭解如何做到這一點
> 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答案。
如果你已經開始瞭解這類事情,我會試圖在日誌空間中工作,即爲勝利添加一個,爲損失減去一個。你可以像其他人一樣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個樣本或更多)的工作,看看相同的「形狀」。
如何使用'sample'? –
好的,我可以使用'sample(c(0,1),n,replace = TRUE)'來獲得我的數字。然後'* 2 + 0.5'並乘以我的x? – Coolcrab