欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 18:51:47
...

Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

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

扫码关注添加客服

进Python社群▲

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

扫码关注添加客服

进Java社群

作者丨程序员吴师兄 

来源丨五分钟学算法(ID:CXYxiaowu)

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

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

猜一下,经过 10000 次的交换,你们认为最后的结果会是怎么样子的?

5

4

3

2

1

登登登,答案是这个样子的。

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

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

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

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

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

   // 初始化数据
   money = new int[100];
   for(int i = 0 ; i < money.length ; i ++)
       money[i] = 100;
一个有意思的分钱模拟问题
初始状态

然后每轮游戏中,每个人都要拿出一元钱随机给另一个人

 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;
       }
  }
一个有意思的分钱模拟问题

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

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;
       }
  }
一个有意思的分钱模拟问题
排序

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

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

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

参考阅读:

看的见的算法:

https://coding.imooc.com/class/138.html

该如何面对这个残酷的世界?:

https://www.sohu.com/a/162310796_99952273

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

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

近期精彩内容推荐:   《最受欢迎的女友职业排行榜Top10》 在一个公司死磕了5-10年的人,都怎么样了? 面试官:你知道java类是怎么跑起来的吗? Python时间模块,超实用总结!


在看点这里好文分享给更多人↓↓