代码之家  ›  专栏  ›  技术社区  ›  Coolcrab

掷硬币游戏(R)

  •  1
  • Coolcrab  · 技术社区  · 11 年前

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

    然而,我不知道如何以一种干净的方式解决这个问题,而不只是对n做一个forloop。

    有什么干净的方法吗?

    4 回复  |  直到 11 年前
        1
  •  7
  •   Paul Hiemstra LyzandeR    11 年前

    您可以使用 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 ,对于一枚公平的硬币( 样品 是)。

        2
  •  3
  •   TheComeOnMan    11 年前

    如果您想运行多次迭代,您可以对此进行循环

    n = 10
    
    toss <- round(runif(n),0)
    toss[toss == 0] = -1
    toss <- 2^toss
    
    Reduce(x = toss,'*')
    
        3
  •  3
  •   Jilber Urbina    11 年前

    这不是最好的方法(我相信有很多更好的方法可以做到),然而,你可以把它作为了解如何做到这一点的一个起点

    > 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
  •  1
  •   Sam Mason    11 年前

    如果你开始考虑这类事情,我会很想在日志空间中工作,也就是说,赢了加一,输了减一。你可以 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个或更多样本)才能看到相同的“形状”。