10个人,每人100块,每分钟每个人拿1块钱,随机给其他人,一小时钱是怎样的?
来源:互联网 发布:图片浏览软件下载 编辑:程序博客网 时间:2024/05/01 08:17
不记得在哪看到这个问题,突然有了兴趣,所以试试。
题意: 一个房间内有100个人,每人都有100块钱,每过1分钟,每个人拿1块钱,随机给其他人。你觉得一段时间后,每个人的钱是怎么样的?
看完题后我第一反应是 不是应该每个人都还有差不多100块吗?
所以我写了个程序跑一下。结果出乎我的意料。
数据我用表格统计出来了
没想到运气最好的那个 既然金额达到200, 其他最少的 已经降到15左右
然后我在想是什么导致 方差变大的? 结果我发现是时间
时间越久方差越大。 穷鬼越穷。 富裕的越有钱
数据如下
真的是 马太效应:强者越强,弱者越弱
下面是我Java源代码 是论坛上一大神写的 我按照我的思路改了
package idea.$for100;import java.util.ArrayList;import java.util.Date;import java.util.Random;public class ExchangeHome implements Runnable{ public static String [] m = new String [10]; //设置三个常量的目的是减小样本数,方便调试,正式版只需要将常量值修改为系统要求即可 /** * 系统运行时间,单位:秒 */ public static int TOTAL_TIME = 1000; /** * 每次交换的时间间隔,单位:秒 */ public static int SPACE_TIME = 1; /** * 系统中的总人数 */ public static int USER_COUNT = 10; /** * 当前时间,单位:秒 */ public static int curTime = 0; /** * 系统中全部用户的列表 */ private ArrayList<User> userList; public ExchangeHome(){ userList = new ArrayList<User>(); User user; for(int i=0;i<USER_COUNT; i++){ user = new User(i); userList.add(user); } } public static void main(String[] args) { ExchangeHome home = new ExchangeHome(); new Thread(home).run();// System.out.println("--- end ---"); String m2 [] = new String [10]; int max = 0; int min = Integer.MAX_VALUE;int count=0; int maxid = 0; int minid = 0; for(int i=0;i<m.length;i++){// System.out.println(m[i]); m2[i] = m[i].substring(m[i].lastIndexOf(">")+1); int temp = Integer.parseInt(m2[i]); System.out.println(temp); if(temp>max){ max = temp; maxid = i; } if(temp<min){ min = temp; minid = i; } if(temp>=100){ count++; } }// System.out.println(maxid+1);// System.out.println(minid+1);// System.out.println(max);// System.out.println(min); } @Override public void run() { while(curTime <=TOTAL_TIME){ try { User payer; User receiver; int receiverId; // System.out.println("______"); for( int i=0;i<USER_COUNT;i++){ payer = userList.get(i); if(payer.getMoney()<=0){ continue; } //随机选取一个用户 Random r = new Random( new Date().getTime());// receiverId = (int) Math.floor(Math.random()*(userList.size()-1)); receiverId = r.nextInt(10);// if(receiverId >=1 ){// //随机到当前用户或者之后的用户,将该ID加一,以保证不会给自己1元钱,并保证所有用户获得馈赠的概率相当// receiverId += 1;// } while(i == receiverId){ receiverId = r.nextInt(10); } receiver = userList.get(receiverId); payer.give(receiver); m[payer.getId()] = m[payer.getId()]+"->"+payer.getMoney();// System.out.println(payer.getId()+"("+payer.getMoney()+") -->" + receiver.getId()+"("+receiver.getMoney()+")"); } Thread.sleep(SPACE_TIME*10); curTime += SPACE_TIME; } catch (Exception e) { } } }}/** * 用户类 */class User{ /** * 用户的钱数 */ private int money = 100; /** * 用户的ID */ private int id; public User(int id) { this.id = id; } /** * 当前用户给目标用户一定量的钱 * @param user */ public void give(User user){ // 这里应该考虑事物管理 this.pay(1); user.receive(1); } /** * 接收一定数目的钱 * @param i */ public void receive(int v) { money += v; } /** * 支付一定数目的钱 * @param v */ public void pay(int v) { money -= v; } /** * 获取用户当前持有的钱数 * @return */ public int getMoney(){ return money; } /** * 获取用户的ID * @return */ public int getId(){ return id; }}
阅读全文
1 0
- 10个人,每人100块,每分钟每个人拿1块钱,随机给其他人,一小时钱是怎样的?
- 知乎问题"房间里100个人,每人1000元,他们玩一个游戏,每轮游戏中,每个人拿出1元,随机给另一个人,最后他们的财富分布是怎样的"实践解答
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 发一个随机红包 100块钱给10个人 每个人最多12块钱 最少6块钱 怎么分
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- “房间里有100个人,每人都有100元钱,每轮每人要拿一元钱随机给另一个人”最后分布的python结果
- 02-算1块,5块,10块,组成100块钱的不同方法
- 25-使用for循环算出1,5,10块组合成100块钱的组合方式
- 一个班级m个人,每人n门课程,求每个人的各科平均成绩和整个班级的各科平均成绩。
- 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出, 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- 有 100 个人围成一个圈,从 1 开始报数,报到 14 的这个人就要退出。然后其他人重新开始, 从 1 报数,到 14 退出。问:最后剩下的是 100 人中的第几个人?
- 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- 40元红包发10个人,每个人最多发6块解决方案。
- 拿两千块钱的薪水要有一万块钱的范儿--蜗居编剧
- 六六:拿两千块钱的薪水要有一万块钱的范儿
- 拿两千块钱的薪水要有一万块钱的范儿
- 7枚硬分给3个人,至少每人1个硬币的概率
- Scrapy爬虫(未完)
- Centos7下安装pip
- java.lang一些基本method的原理学习
- 数学体系
- 05. JVM字节码执行引擎
- 10个人,每人100块,每分钟每个人拿1块钱,随机给其他人,一小时钱是怎样的?
- 分布式java应用(一)
- 软件系统开发流程
- 剑指offer 15---判断链表是否带环?若带环求环的长度?若带环求环的入口点?
- Numpy数组
- 英语语法4-过去进行时
- 07. JVM内存模型
- 【STL】hdu 4022 Bombing
- JavaScript函数的常用的两种调用方式