一个有意思的分钱模拟问题

简介: 一个有意思的分钱模拟问题。

大家好,今天来分享一个有意思的分钱模拟问题,为了帮助大家理解,采取了可视化的方式。

这个问题描述是这样的:房间里有 100 个人,每人都有 100 元钱,他们在玩一个游戏。每轮游戏中,每个人都要拿出一元钱随机给另一个人,最后这 100 个人的财富分布是怎样的?

猜一下,经过 10000 次的交换,你们认为最后的结果会是怎么样子的?
5
4
3
2
1
登登登,答案是这个样子的。

image.png

和你的直觉想法有出入吗?是不是一开始认为是平均分布的?

事实上,很多人一开始都没想到结果会是这样子的。

我们借助 Java GUI 来可视化的理解这个问题。

首先初始化数据,一开始每人都有 100 元钱。

// 初始化数据
   money = new int[100];
   for(int i = 0 ; i < money.length ; i ++)
       money[i] = 100;

image.png

初始状态


然后每轮游戏中,每个人都要 拿出一元钱随机给另一个人
for(int i = 0 ; i < money.length; i ++){
      if(money[i] > 0){
          int j = (int)(Math.random() * money.length);
          money[i] -= 1;
          money[j] += 1;
       }
  }

1.gif

不够直观?那我们可以先排序再显示。

Arrays.sort(money);
for(int i = 0 ; i < money.length; i ++){
      if(money[i] > 0){
          int j = (int)(Math.random() * money.length);
          money[i] -= 1;
          money[j] += 1;
       }
  }

2.gif

排序


我们可以发现,初始时所有人的财富值相等,随着游戏的进行,财富值差距越来越大,而不是均匀分布。

感兴趣继续研究的小伙伴可以下载下方的源码。

完整代码: https://github.com/MisterBooo/AmazingAlgo

参考阅读:

来源 | 五分钟学算法
作者 | 程序员吴师兄

相关文章
|
Java
微信红包的模拟代码
微信红包的模拟代码
139 1
|
6月前
|
算法
详细解读7.2模拟赛
详细解读7.2模拟赛
18 0
|
网络协议 Java 应用服务中间件
【红包雨压测环境】
【红包雨压测环境】
140 0
模拟双色球小程序
模拟双色球小程序
(模拟)(笔记)1241. 外卖店优先级
(模拟)(笔记)1241. 外卖店优先级
82 0
|
JavaScript
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
369 0
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
L2-040 哲哲打游戏 (25 分)(模拟)
L2-040 哲哲打游戏 (25 分)(模拟)
135 0
L2-029 特立独行的幸福 (25 分)(数组模拟)
L2-029 特立独行的幸福 (25 分)(数组模拟)
132 0
|
小程序 前端开发 JavaScript
透过开发抽奖小程序,体会创新与迭代
一次偶然机会,我做了一个大转盘抽奖的产品放到淘宝服务市场给商家用,不到2天,就有很多用户来咨询,我感受到了一丝兴奋,于是快马加鞭的迭代开发,也有很多朋友的帮助,每天编程到午夜2点。随之而来的大量用户,我确定了方向,电商平台需要有个性化的营销工具,抽奖就是最简单最清晰的首选工具。一周后我的新产品抽奖靠手上线了,主要提供帮助商家设置抽奖营销,商家可以服务他们的用户。在2013年双11,通过这个小产品,我挣到了6万元。
下一篇
DataWorks