通過SQL解讀財富的分配(二)

jeanron100發表於2017-08-09

   之前分析過一篇《通過SQL解讀財富的分配》,當時還不過癮,其實是我還沒看到很多自己期望看到的資料,於是後面又做了一些測試,先測試了一版2000萬的資料,得到的結果和100的差別不大,本來想來一個全球70億人的遊戲大聯歡,但是確實蠻有挑戰。

   如果後期還準備玩這個遊戲,我就加入更多的資料維度更有意義。

   今天測試的是四個場景,樣本基數是1000人,測試100次。

    1)房間裡有1000個人,每人都有1元錢,他們在玩一個遊戲。每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,最後這1000個人的財富分佈是怎樣的?

    2)房間裡有1000個人,每人都有1元錢,他們在玩一個遊戲。每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,如果自己手頭沒有錢,可以每次透支1元錢,最後這1000個人的財富分佈是怎樣的?

    3)房間裡有1000個人,每人都有1000元錢,他們在玩一個遊戲。每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,最後這1000個人的財富分佈是怎樣的?

   4)房間裡有1000個人,每人都有1000元錢,他們在玩一個遊戲。每輪遊戲中,每個人都要拿出一元錢隨機給另一個人,如果自己手頭沒有錢,可以每次透支1元錢,最後這1000個人的財富分佈是怎樣的?

   猛一看,好像都差不多,其實資料差別大了去了。

1


   第一個是每次1元的本錢,反覆100次,不透支。得到的資料如下,可以看到絕大多數的人都是手裡空空,或者原地踏步,能夠稍有成就的都是少數,能夠出類拔萃的那是極少數。


2

第二個場景是,允許你透支,如果手頭沒錢,每次透支1元,反反覆覆100次。

第二組資料的差異化很大,輸得最多的人輸了近99元,贏得最多的人差不多是79,而中間的比例很明顯,贏得14元和輸了11元的比例相當,佔的比重較高。

3

第三組資料,我們玩大一些,每次1元有些太少了。就來本錢是1000元。每一輪迴歸1000元,重新開始,試驗100輪。

這組資料很有意思,至少不會輸得精光。而且從測試結果來看肯定該不會,至少能夠有900元在手。而運氣好的人,運氣也好不到哪裡去。最多能夠贏得75元,即1075元在手。

這個結果和我的初步想法差距很大,如果以中線1000為界,虧的人還是要多一些。


4

第四組資料更激進些,每個人還是1000的本錢,允許透支,每次1元,反反覆覆100次。

實驗了100次,最少的還是900元,但是比例極低,基本的區間還是在999~1001之間。

但是增幅其實很小,不會有大起大落。



如果要測試指令碼,其實很簡單,就幾行SQL改動一下即可。

變更核心邏輯:

--delete from test_money;
--insert into test_money select level,1  from dual connect by level <=1000;
--commit;

begin
for i in 1..1000 loop
update test_money set money=money-1 where pid=i;
update test_money set money=money+1 where pid=trunc(dbms_random.value(0,1000)) ;
end loop;
end;
/
set pages 200
select money,count(*)from test_money group by money order by money;


前端的排程器和資訊彙總

for i in {1..100}
do
sqlplus -s / as sysdba<<EOF
@test.sql
EOF
sqlplus -s / as sysdba <<EOF
set pages 200
insert into test_money_sum select money,count(*)from test_money group by money;
select money,sum(money_cnt)/100 from test_money_sum group by money;
EOF
done


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2143323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章