所以试着模拟一个掷硬币的游戏,如果你得到正面,你的钱会加倍,如果你有故事,你的钱会减半。如果你从 x 钱开始,想看看在 n 次投掷后你会得到什么
但是我不确定如何以一种干净的方式解决这个问题,而不仅仅是对 n 进行 forloop。
有什么干净的方法可以做到这一点吗?
所以试着模拟一个掷硬币的游戏,如果你得到正面,你的钱会加倍,如果你有故事,你的钱会减半。如果你从 x 钱开始,想看看在 n 次投掷后你会得到什么
但是我不确定如何以一种干净的方式解决这个问题,而不仅仅是对 n 进行 forloop。
有什么干净的方法可以做到这一点吗?
您可以使用和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
如果你想运行多次迭代,你可以循环这个
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
和试验次数作为参数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)
,请参阅@Paul Hiemstra 答案。
如果您开始对这类事情有所了解,我会很想在日志空间中工作,即加一表示赢,减一表示输。您可以sample
像其他人一样,即@Paul 的回答。
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)
将打印这些运行长度的频率,这可能会变得非常长。您可以使用负二项分布来查看它的来源:
plot(table(rle(y)$len) / length(y))
points(1:15, dnbinom(1:15, 1, 0.5), col=2)
尽管您可能需要使用更大的样本(即 1000 个或更多样本)才能看到相同的“形状”。