赌徒50%输赢问题

 

 

 

原问题:

 

如果赌博输赢的概率都是50%,为什么长久赌博的人多会倾家荡产而不是收益均衡?

 

单从概率上来说,假如赌博输赢概率50%应该和抛硬币是一样的吧,抛硬币次数多了正反面比率基本相同,那么长久赌博的人为什么多不是收支平衡呢?

 

来自知乎https://www.zhihu.com/question/63334274

 

李佳飞原答案:

 

 

 

作者:李佳飞 链接:https://www.zhihu.com/question/63334274/answer/210926622 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

设定

我们假设有 1000 个玩家,每人手里有 10000 元的筹码,可以用来赌博。

  • 每一局游戏,玩家都可以抵押 500 元的筹码。输了,筹码不退还;赢了,筹码翻倍。
  • 输赢的概率各占 50%。
  • 所有玩家一共进行 100 局游戏。一旦任何玩家筹码为0,必须中途退出游戏。

 

好,开始了游戏设定,我们按照设定模拟一下,看看会发生什么吧。100次游戏之后,大家的财富分配是怎样的呢?

 

右边的两张图分别是 1000 位玩家的财富柱状图和排位图。红线表示初始资金 10000元 的位置。我们看到,这个时候的财富分配还比较平均,有大约 55%的人财富在 10000 以上。

 

实验

有了这个模拟器,我们可以改变原始游戏的一些参数,看看会发生什么不同的结果。

 

【实验一:加大赌注】

之前我们说,每场游戏的赌注是500元。如果游戏的赌注增加,会对最后的结果有怎样的影响?

 

 

赌注增大到 1000 元。游戏结束时,有近 300 人余额为 0。余额 10000 以上的人数约为50%。

 

 

赌注增大到1500元,游戏结束时有近 600 人余额为 0。余额 10000 以上的人数小于40%。

 

 

增加赌注到 3000 元,游戏结束时有近 800 人余额为0。余额 10000 以上的人数约在20%-25%。

 

【讨论】

1. 没钱就不要玩什么豪赌了,不然最后吃不了兜着走的肯定是你。

2. 不要迷恋赌神和暴富神话,毕竟参与人数多了,总会出现少数的幸运儿。比如,我模拟了一下,在赌注不同的情况下,游戏结束时拥有财富最多的玩家有多少筹码,结果让人吃惊。

    • 赌注为 500元时,游戏结束时最大财富为 25000;
    • 赌注为 1000元时,游戏结束时最大财富为 38000;
    • 赌注为 1500元时,游戏结束时最大财富为 58000;
    • 赌注为 3000元时,游戏结束时最大财富为 88000;

如果你总是盯着少数赢家看,觉得自己能够通过赌博一夜暴富,那相信我,你最后还是倾家荡产的几率比较大。

 

【实验二:减少胜率】

有不少答主说,出于盈利的考虑,赌场的胜率要小于 50%。我们就一起来看看减少胜率对于结果的影响。

我们回到最开始的情况:1000位参与者,500元的赌注,100局游戏,不过允许胜率小于50%。

 

 

胜率从50%降低为48%,我们看到,游戏结束时,余额 10000 以上的人数已经从原来的55%左右掉到小于40%了!

 

胜率降低到45%,游戏结束时有 200 多人余额为0,失败离场。余额 10000 以上的人数小于20%。

 

胜率降低到 40%,游戏结束时有 600 多人余额为0,失败离场。余额 10000 以上的人数在5%-10%之间。

 

胜率降低到 30%,太惨不忍睹了,各位自己看吧....

 

【讨论】

  1. 赌场只需要极小地改变游戏胜率,就可以极大地改变游戏者的结果。把胜率从50%改到45%,游戏者回本的概率就从55%降低到 20%左右。
  2. 小胜率 × 多次玩= 倾家荡产

 

【实验三:增加赌博持续时间】

我们知道,赌博有其心理成瘾性,所以好赌之人往往很难戒掉赌博这个恶习。放在我们的例子中,如果我们让游戏持续 100 局以上,会发生什么呢?

 

游戏持续 500 局,游戏结束时有接近400人余额为0。余额 10000 以上的人数小于50%。

 

游戏持续 1000 局,游戏结束时有500多人余额为0。余额 10000 以上的人数约为40%。

 

游戏持续 2000 局,游戏结束时有600多人余额为 0。余额 10000 以上的人数在25%左右。

 

【讨论】

  1. 在赌场中,没有人是常胜将军。你从人生前 100 局游戏中获得的收入,很可能会在第 500 局之前消失殆尽。
  2. 这个实验的局限性在于,我们假设赢钱的人要一直玩下去,玩到游戏结束为止。而输钱的人输到倾家荡产就会退出。这个假设,是不是合理呢?各位又怎么看?

 

读到这,有不少读者朋友可能都会好奇这个模拟器的原理。其实,这是我刚才用半个多小时拿 Shiny 自己写的,大家可以通过以下的链接,自己改改参数,随手玩一玩。

Gambler Simulation

来个俗套的:如果这个回答过了千赞,我可以考虑一下公布源代码(笑)

 

 

 ——————————————————————————————————————————————————————————

 

作者:李佳飞
链接:https://www.zhihu.com/question/63334274/answer/210926622
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(shiny)
library(gridExtra)
# Define UI for application that draws a histogram
ui <- shinyUI(fluidPage(

   # Application title
   titlePanel("Gambler Simulation"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
         sliderInput("size",
                     "Number of Gamblers:",
                     min = 100,
                     max = 1000,
                     value = 20),
         sliderInput("winp",
                     "Winning Probability",
                     min = 0,
                     max = 1,
                     value = 20),
         sliderInput("bid",
                     "Bid (per Game)",
                     min = 100,
                     max = 5000,
                     value = 20),
         sliderInput("iter",
                     "Iterations",
                     min = 100,
                     max = 2000,
                     value = 20),
         sliderInput("bins",
                     "Number of Bins",
                     min = 1,
                     max = 50,
                     value = 30)
      ),

      # Show a plot of the generated distribution
      mainPanel(
         plotOutput("distPlot"),
         plotOutput("distLine")
      )
   )
))

# Define server logic required to draw a histogram
server <- shinyServer(function(input, output) {

   output$distPlot <- renderPlot({
     gamblers = rep(10000,input$size)
     for (i in 1:input$iter){
       gain = (2*rbinom(input$size, 1, input$winp) -1)*input$bid
       gamblers[gamblers>=input$bid] <- gamblers[gamblers>=input$bid] + gain[gamblers>=input$bid]
       gamblers[gamblers>100000] <-100000
       }
     bins <- seq(min(gamblers), max(gamblers), length.out = input$bins + 1)

      # draw the histogram with the specified number of bins
      hist(gamblers, breaks = bins, col = 'darkgray', border = 'white', ylim = c(0,input$size),
           xlab = "Wealth")
   })
   output$distLine <- renderPlot({
     gamblers = rep(10000,input$size)
     for (i in 1:input$iter){
       gain = (2*rbinom(input$size, 1, input$winp) -1)*input$bid
       gamblers[gamblers>=input$bid] <- gamblers[gamblers>=input$bid] + gain[gamblers>=input$bid]
       gamblers[gamblers>100000] <-100000
     }
     bins <- seq(min(gamblers), max(gamblers), length.out = input$bins + 1)

     # draw the histogram with the specified number of bins
     plot(sort(gamblers), type = 'l', xlab= "Wealth", ylab = "Number of Gamblers")+
       abline(h = 10000, col = "red")

   })
})

# Run the application 
shinyApp(ui = ui, server = server)

 

 

接下来我将原答案的代码使用Java遵循原意实现

(待更)

 

posted @ 2017-09-15 09:16  axyio_2K20  阅读(1107)  评论(0编辑  收藏  举报