10个人,每人100块,每分钟每个人拿1块钱,随机给其他人,一小时钱是怎样的?
2017-07-15 12:58
351 查看
不记得在哪看到这个问题,突然有了兴趣,所以试试。
题意: 一个房间内有100个人,每人都有100块钱,每过1分钟,每个人拿1块钱,随机给其他人。你觉得一段时间后,每个人的钱是怎么样的?
看完题后我第一反应是 不是应该每个人都还有差不多100块吗?
所以我写了个程序跑一下。结果出乎我的意料。
数据我用表格统计出来了
没想到运气最好的那个 既然金额达到200, 其他最少的 已经降到15左右
然后我在想是什么导致 方差变大的? 结果我发现是时间
时间越久方差越大。 穷鬼越穷。 富裕的越有钱
数据如下
真的是 马太效应:强者越强,弱者越弱
下面是我Java源代码 是论坛上一大神写的 我按照我的思路改了
题意: 一个房间内有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); } 4000 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; } }
相关文章推荐
- 知乎问题"房间里100个人,每人1000元,他们玩一个游戏,每轮游戏中,每个人拿出1元,随机给另一个人,最后他们的财富分布是怎样的"实践解答
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出
- 发一个随机红包 100块钱给10个人 每个人最多12块钱 最少6块钱 怎么分
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次通过山洞的人名
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次通过山洞的人名
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- 房间内有 100 人,每人有 100 块,有钱的人每分钟随机给另一个人 1 块,最后这个房间内的财富分布怎样?
- “房间里有100个人,每人都有100元钱,每轮每人要拿一元钱随机给另一个人”最后分布的python结果
- 100元随机分给10个人 最多20 最少0.01
- 随机生成50个数,范围在【10,50】,统计每个数字出现的次数以及出现次数最多的数字与它的个数。
- 怎样简单保存下载 Windows 10 随机聚焦锁屏壁纸?
- 随机产生50个整数,位于[10,50],统计每个数字出现的次数以及出现次数最多的数字与出现次数并打印.如果出现次数为0不打印,打印时要求升序
- ss请cc来家里钓鱼,鱼塘可划分为n*m的格子,每个格子有不同的概率钓上鱼,cc一直在坐标(x,y)的格子钓鱼,而ss每分钟随机钓一个格子。问t分钟后他们谁至少钓到一条鱼的概率大?为多少?
- 一个班级m个人,每人n门课程,求每个人的各科平均成绩和整个班级的各科平均成绩。
- 随机生成 50 个数字,每个数字的范围在 [10, 50] 之间,统计每个数字出现的次数,最后将每个数字和它出现的次数打印出来