2

JFrame来表现百人分钱问题的,现在记录一下实现和自己的思考。

百人分钱题:

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

人们一般都会觉得后面应该财富分配也是差不多的,毕竟每个人失去钱的概率和得到钱的概率都是一样的,但在很多事情上人们的感觉都是不准的,例如视觉欺骗,眼见都不一定为实

clipboard.png

面对这种情况我们为什么不写一个程序来验证呢?身为一个初级程序员,在解决问题的时候却老是想不到利用计算机,这是不好的,我们完全可以利用计算机去解决很多问题并且在解决问题的过程中自己也能得到提升,何乐而不为呢?产生这了个意识,也算这个教程的收获之一吧。

算法实现

这个算法可以说十分简单
用一个无限循环,然后每次一个人减少一块另一个人增加一块
然后把每个人的钱用矩形表现出来

    private void run(){
        while(true){
            Arrays.sort(money);
            frame.render(money);
            AlgoVisHelper.pause(DELAY);

            for (int k = 0 ; k < 50 ; k ++){
                for (int i = 0 ; i < money.length ; i ++) {
                        int j = (int)(Math.random() * money.length);
                        money[i] -= 1;
                        money[j] += 1;
                }
            }
        }
    }

上面就是算法的逻辑代码,绘图代码就不再给出了,若是想获得完整代码可以访问:

https://github.com/mengyunzhi/secondOf2018/tree/liyiheng/2018-9-20/src

下面是实现效果

clipboard.png

特别多钱,但是我们都知道得到的所谓的随机数是伪随机数,是根据算法有规律的生成的产生上面的情况会不会是因为这个随机数并不随机的原因,但我看网上的对这个问题的解法都没说这个,也许是我对这个“伪随机数”的说法还不够深吧,只能继续学习留待以后解决了。

总结

通过这次学习了解了java的JFrame类,虽然已经快淘汰了,同时产生了用计算机解决问题的思想,虽然现在技术问题能解决的并不多,同时用动画实现算法无疑是生动有趣的,对算法的理解和兴趣都有了很大的提升。


笙歌会停
1k 声望45 粉丝

代码成就万世基积沙镇海 梦想永在凌云意意气风发