r - 如何在 r 中针对 "gambling"问题和返回概率编写模拟?

标签 r function simulation

我正在尝试在 R 中运行模拟,但我不确定从哪里开始。问题如下:

“您有 100 美元,并且在一场公平的比赛中下了 10 美元的赌注。当您下第 100 次赌注时,您输光所有钱的概率是多少?”

到目前为止,我已经编写了一个小函数来从“掷硬币”中生成随机结果,但这是我所能得到的。

win.lose <- function(x){
  sample(0:1, x, rep=TRUE)
}

我担心的是,此功能不考虑从奖金中赚钱。在这里为上述问题编写更好的函数的一些帮助将不胜感激。谢谢!

最佳答案

使用矢量化效果最好。我们应该一次对所有样本进行采样,而不是循环:

sample(c(-1, 1), 100, replace = TRUE)

我们还知道,如果净亏损 10 次,我们就会破产。转换为累积总和:

cumsum(sample(c(-1, 1), 100, replace = TRUE))

any(cumsum(sample(c(-1, 1), 100, replace = TRUE)) == -10)

最后,我们可以使用 replicate() 来重复这个完全相同的模拟:

#specify simulation criteria
n <- 100 
n_sim <- 10

# betting criteria
n_broke <- 10 #if we have 10 net losses, we're broke
bet <- 10 #each bet is $10

# way 1
set.seed(123)
replicate(n_sim, cumsum(sample(c(-1, 1), n, replace = TRUE))) 

#or with actual money totals - note, 1st row is the initial money amount
set.seed(123)
replicate(n_sim, cumsum(c(n_broke * bet, bet * sample(c(-1, 1), n, replace = TRUE))))

#or a summary of it:
set.seed(123)
table(replicate(n_sim, ifelse(any(cumsum(sample(c(-1, 1), n, replace = TRUE)) == -n_broke), 'Out_of_Money', 'Has_Money')))

#faster way to do it:
set.seed(123)
table(
  ifelse(
    apply(matrix(sample(c(-1,1), n * n_sim, replace = TRUE), ncol = n_sim),
          2,
          function(x) min(cumsum(x)) <= -n_broke),
    'Out_of_Money', 'Has_Money')
)

对于 n_sim = 10,000:

   Has_Money Out_of_Money 
        6783         3217 

以及幕后发生的事情:

set.seed(123)
replicate(n_sim, cumsum(c(n_broke * bet, bet * sample(c(-1, 1), n, replace = TRUE))))
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,]  100  100  100  100  100  100  100  100  100   100
  [2,]   90   90  110  110   90  110  110  110   90   110
  [3,]   80  100  120  120   80  120  120  100   80   120
  [4,]   70  110  130  110   70  130  130   90   90   110
  [5,]   80  100  120  120   60  140  120   80  100   100
  [6,]   70  110  130  110   50  130  110   90   90   110
  [7,]   80  120  140  100   40  120  100   80   80   120
  [8,]   90  110  150  110   50  110   90   70   70   130
  [9,]  100  100  140  100   40  100  100   60   60   120

关于r - 如何在 r 中针对 "gambling"问题和返回概率编写模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58784735/

相关文章:

r - 如何在运行时 Shiny 的 rmarkdown html_notebook 中使用 renderPlot 布局 2 行,然后是 1 列

python - 使用 R/igraph,有没有办法在考虑唯一节点属性的计数的情况下找到节点之间的最短路径?

excel - 对大数使用 DEC2BIN()

c++ - 检查 VEINS 中的重复项

r - 哪些数字存在于向量中但不存在于另一个向量中

r - 无法在 automl() 用例中加载未获胜的模型

simulation - 基于时间的编程如何完成?

artificial-intelligence - 历史库存数据来源

string - 在 Excel 中通过字符串创建函数

JavaScript 函数柯里化(Currying)不适用于实例方法