10个人,每人100块,每分钟每个人拿1块钱,随机给其他人,一小时钱是怎样的?

不记得在哪看到这个问题,突然有了兴趣,所以试试。
题意: 一个房间内有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;
    }

}
已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页