一道算法小题

一道社会小题用Java实现一下。
一开始有100个人,每个人都有100元在每一轮都做如下的事情,每个人都必须拿出1元钱给除自己以外的其他人,给谁完全随机如果某个人在这一轮的钱数为0,那么他可以不给,但是可以接收发生很多轮之后,这100人的社会财富分布很均匀吗?
代码实现过程:

 public static void main(String[] args) {

        System.out.println("测试开始");
        int n = 100;//人数
        int t = 100000;   //轮数
        System.out.println("人数" + n);
        System.out.println("轮数" + t);
        experiment(n, t);
        System.out.println("测试结束");
    }

    public static void experiment(int n, int t) {
        //先给每个人100块
        double[] wealth = new double[n];
        Arrays.fill(wealth, 100);

        //先假设每个人没有钱
        boolean[] hasMoney = new boolean[n];
        for (int i = 0; i < t; i++) {
            Arrays.fill(hasMoney, false);
			/*防止收钱和给钱在同一轮发生,
			比如:第10个人本来这一轮没有钱了,他不需要给钱,
			但是可能前九个人有人在这一轮给他钱了,如果没有先判断
			是否有钱,那么这一轮第10人就要给钱了。
			需要两个循环和hasMoney,第一个循环确定
			这一轮有多少人有钱,并且记录有钱人。
			*/
            for (int j = 0; j < n; j++) {
                //判断这一轮每个人是否有钱
                if (wealth[j] > 0) {
                    hasMoney[j]=true;
                }
            }
            /*
            第二个循环判断这一轮有钱人给钱,
            这一轮没有钱的接受钱,不用给钱。
            */
            for (int j = 0; j < n; j++) {
                //有钱才能加入游戏
                //没钱接受别人
                if (hasMoney[j]) {
                    int other = j;
                    do {
                    	//随机给别人一块钱
                        other = (int) (Math.random() * n);
                    } while (other == j);
                    wealth[j]--;
                    wealth[other]++;
                }
            }
        }
        //财富值进行排序
        Arrays.sort(wealth);
        System.out.println("从贫穷到富有");
        for (int i = 0; i < wealth.length; i++) {
            System.out.print((int) wealth[i] + " ");
            if (i % 10 == 9) {
                System.out.println();
            }
        }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值