1. 程式人生 > >學習圖形化介面實現百人分錢問題的收穫與問題

學習圖形化介面實現百人分錢問題的收穫與問題

前兩天看了一個教程是關於用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;
                }
            }
        }
    }

上面就是演算法的邏輯程式碼,繪圖程式碼就不再給出了,若是想獲得完整程式碼可以訪問:

下面是實現效果1.gif

隨機數的問題

從上面可以看出,有的人會負債特別多,有的人會得到特別多錢,但是我們都知道得到的所謂的隨機數是偽隨機數,是根據演算法有規律的生成的產生上面的情況會不會是因為這個隨機數並不隨機的原因,但我看網上的對這個問題的解法都沒說這個,也許是我對這個“偽隨機數”的說法還不夠深吧,只能繼續學習留待以後解決了。

總結

通過這次學習瞭解了java的JFrame類,雖然已經快淘汰了,同時產生了用計算機解決問題的思想,雖然現在技術問題能解決的並不多,同時用動畫實現演算法無疑是生動有趣的,對演算法的理解和興趣都有了很大的提升。