【问题标题】:Coin Toss game in RR中的抛硬币游戏
【发布时间】:2013-09-27 08:29:19
【问题描述】:

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

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

有没有一些干净的方法可以做到这一点?

【问题讨论】:

  • sample怎么样?
  • 好的,我可以使用sample(c(0,1), n, replace = TRUE) 来获取我的号码。然后*2+0.5 和我的 x 相乘?

标签: r statistics probability


【解决方案1】:

您可以使用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 是)。

【讨论】:

  • cumulative_prod 不会收敛到 1!简单随机游走在分布中收敛到正态分布。由于您是乘法而不是加法,因此,cumulative_prod 将在分布中收敛到以 1 为中心的对数正态分布。
  • 这里有点语义,在上面的文本中,我指的是converge to 1,因为期望值等于1。我认为对于这个小例子来说,保持这种方式就足够了不要迷失在统计术语中。
  • 没关系。我只是指出,如果你使用不公平的硬币,例如sample(c(0.5,2), Nsims, replace=TRUE, prob=c(.51,.49)),那么乘积确实收敛到 0 a.s.,考虑这个例子时可能会很有趣。
【解决方案2】:

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

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 和试验次数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 答案。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 2021-03-12
        • 1970-01-01
        • 2015-12-20
        • 2021-12-28
        相关资源
        最近更新 更多