在 n 次交易之后,所有财富都集中到一个口袋里的概率是多少?

机器算法验证 可能性 模拟
2022-04-02 07:00:40

在 Joe Rogan 的播客 #1769 中,Jordan Peterson 博士说了这样的话:

  1. 以人口 10 人为例,每人起价 100 美元。
  2. 他们将基于抛硬币“交易”。谁“输”了,就得给对方一美元。
  3. 从长远来看,所有的财富都会集中到一个口袋里。

起初,我不敢相信这是真的,因为平衡随机性会给这个系统带来(与“知情交易者”情景相比)。每个玩家都会赢多少,就会输多少,结果是一场零和的无尽游戏。

玩家的预期财富n交易:

E[w]=w0+i=0n12×1+i=0n12×1
E[w]=w0+n2n2
E[w]=w0

我运行了一个 Python 模拟,在第一次运行中我得到了这个: It took 70431 individual trades for all wealth to be concentrated in one pocket.

我在这里错过了什么吗?


这是模拟的代码: https ://gist.github.com/victorvalentee/1c04b2d16005f7372273b153fe9ece23

3个回答

这是一个被操纵的游戏:)你有一个吸引人的状态:一个人得到了所有的钱。如果某个特定时刻某个人以某种方式获得了所有的钱,那么没有人可以交易任何东西,游戏就停止了。可以肯定的是,如果你玩得足够长,这最终必然会发生,即在某个时候,你会观察到将所有钱都放在一个口袋里的交易顺序。这与平衡无关,这与随机游走中称为首次命中时间的问题有关。

如果我们不允许卖空和保证金交易,实际上还有另一种吸引人的状态:一个玩家达到零财富并停止交易,而其他人继续交易。这就是为什么在有两个以上交易者的游戏中估计概率并不简单,您必须考虑玩家随着时间的推移而流失

这是一个数量级的计算,计算只剩下一个玩家需要多长时间。

对于任何玩家,让p是他们在之后退出游戏的概率n转身。所以概率8玩家已经退出并且2剩下的是45p8(1p)2. 的概率9玩家已经退出并且1遗骸是10p9(1p). 最有可能的情况是,当只剩下一名玩家时10p>45(1p),即当p>9/11.

当玩家进入负财富时,就会出现退出。根据反射原理,玩家有一个9/11负财富的概率nth如果他们有一个9/22负财富的概率nth转动。因为他们财富的标准差是nn反过来,如果发生这种情况

922=.409=Φ(100n)
0.23=100n
n189000
在哪里Φ是累积正态概率

因此,根据这个估计,模态场景是除了一个玩家以外的所有玩家在 189000 回合后都退出了,这与您在实验中发现的 70000 个数量级相同。

Aksakal 的回答已经充分解释了为什么财富最终会落入一个口袋。在这个答案中,我们进一步阐述了 Matt F.

可以根据特定玩家留在游戏中的概率来计算概率,并独立考虑玩家的位置。

那么有两种方式

  • 只有一个玩家在游戏中的概率等于一个玩家达到最大金额的概率。让我们称独立玩家获胜的概率pwin.

    没有玩家获胜的概率是

    (1pwin)n

  • 只有一名玩家参与游戏的概率等于不超过n2玩家已经赔钱了。让我们称这个概率为独立玩家松手ploose.

    没有一个玩家获胜的概率,是少于 9 个玩家失败的概率,并且是

    1(ploose)nn(1ploose)(ploose)n1

但是,当我应用这些公式时,我会得到小的差异。一种方法高估了比赛结束前的试验次数,另一种方法低估了它。

差异的原因是各个玩家的分数是相关的。如果一名球员在之后输了n游戏,那么这会降低其他玩家输掉比赛的概率n游戏。

阴谋

在图像中,我们还绘制了与矩量法拟合的逆高斯分布,它似乎与模拟确定的分布形状相当吻合。因此,可能可以使用逆高斯作为分布模型(但仍然需要计算均值和方差)。

### function to simulate game
sim = function(k=100,n=5) {
  # x: is a variable that keeps track of values, 
  # the size of this variable will reduce 
  # once participants hit zero
  x = rep(k,n)    
  ### n_active: number of active participants
  ### these equals the lenght of 'x' but we do not 
  ### want to compute that length everytime
  n_active = n
  ### counts: keeping track of the number of games
  counts = 0
  while (n_active>1) {
    counts = counts + 1
    
    ### sample two players
    s = sample(1:n_active,2)
    ### add +1 and -1 to the wealth of the players
    x[s] = x[s] + c(1,-1)
    
    ### check for zero wealth and remove the participant from 'x' if neccesary
    if (x[s[1]]==0) {
      x = x[-s[1]]
      n_active = n_active -1 
    }
    if (x[s[2]]==0) {
      x = x[-s[2]]
      n_active = n_active -1 
    }
  }
  return(counts)
}

### simulations
set.seed(1)
y = replicate(10^3,sim())

### plot histogram
hist(y, breaks = seq(0,10^6,10^4), main = "histogram of simulations \n compared with approximations")


### add estimates based on an individual's probability to loose or win after n turns
n = seq(0,10^6,10^4)

p1 = pnorm(500,mean = 100,sd = sqrt(0.4*n))-pnorm(-500,mean = 100,sd = sqrt(0.4*n))
lines(n[-1],-diff(p1^5)*10^3, col = 2)

p2 = pnorm(0,mean = 100,sd = sqrt(0.4*n))*2
lines(n[-1],-diff(pbinom(1,5,p2))*10^3, col = 3)

### add inverse gaussian curve fitted with method of moments
lines(n,statmod::dinvgauss(n, mean(y), dispersion = var(y)/mean(y)^3)*10^7, col = 4)

legend(4*10^5, 80,
       c("estimate based on probability of winning", "estimate based on probability of loosing",
         "inverse Gauss distribution"),
       cex = 0.7, col = c(2,3,4), lty = 1)