1

所以试着模拟一个掷硬币的游戏,如果你得到正面,你的钱会加倍,如果你有故事,你的钱会减半。如果你从 x 钱开始,想看看在 n 次投掷后你会得到什么

但是我不确定如何以一种干净的方式解决这个问题,而不仅仅是对 n 进行 forloop。

有什么干净的方法可以做到这一点吗?

4

4 回答 4

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将收敛于, 。1sample

于 2013-09-27T08:39:08.303 回答
3

如果你想运行多次迭代,你可以循环这个

n = 10

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

Reduce(x = toss,'*')
于 2013-09-27T08:40:09.173 回答
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和试验次数作为参数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 答案。

于 2013-09-27T08:40:34.970 回答
1

如果您开始对这类事情有所了解,我会很想在日志空间中工作,即加一表示赢,减一表示输。您可以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 个或更多样本)才能看到相同的“形状”。

于 2013-09-27T15:59:28.257 回答