找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2002|回复: 0
收起左侧

一个对帕里托定律的复现的C语言小实验

[复制链接]
ID:238527 发表于 2020-2-16 17:01 | 显示全部楼层 |阅读模式
“帕累托定律”(Pareto law),即只有很少一部分人能获得最多的资本,并且发现最成功的人其天赋中庸,但他们却非常幸运。而这样的结果也与现实世界惊人的相似。对该定律做了一个小实验,进行了复现。在本文设计的模型中,假设共有1000个个体,他们的天赋服从均值为0.6、方差为0.1的正态分布,并且为每个个体赋予了10的初始资本。将这1000个体随机的分布在一个正方形区域内,他们被一些事件所包围。这些事件分为幸运事件和不幸事件,在初始时,它们被随机地分配到正方形区域内。本实验对这1000个个体进行40年的模拟,每六个月,这些事件将进行一次移动,并且与个体发生交互。当这些事件与个体相遇时,个体的资本便产生相应的变化。其变化规则为:若是个体与幸运事件相遇,则产生一个(0,1)的随机数,若这个随机数小于该个体的天赋则将个体的资本翻一倍,否则资本保持不变;若是遇到不幸事件,则将该个体的资本减半。

C语言源程序如下:
  1. ub=1;lb=-1;i=1000;
  2. hold on
  3. for i=1:1000
  4. x=randn(1);y=randn(1);
  5. while x>ub || x<lb || y>ub || y<lb
  6. x=randn(1);y=randn(1);
  7. end
  8. pos(i,:)=[x y];
  9. end
  10. title('随机人员图');
  11. figure(1);
  12. plot(pos(:,1),pos(:,2),'o');

  13. ub=1;lb=-1;i=250;
  14. hold on
  15. for i=1:250
  16. a=randn(1);b=randn(1);c=rand
  17. while a>ub || a<lb || b>ub || b<lb
  18. a=randn(1);b=randn(1);
  19. end
  20. pos1(i,:)=[a b];
  21. end
  22. plot(pos1(:,1),pos1(:,2),'*r')

  23. ub=1;lb=-1;i=250;
  24. hold on
  25. for i=1:250
  26. a=randn(1);b=randn(1);c=rand
  27. while a>ub || a<lb || b>ub || b<lb
  28. a=randn(1);b=randn(1);
  29. end
  30. pos2(i,:)=[a b];
  31. end
  32. plot(pos2(:,1),pos2(:,2),'*g')

  33. legend('人员','幸运事件','不幸事件');

  34. for i=1:1:1000
  35.     GN(i,1)=0;
  36.     BN(i,1)=0;
  37. end

  38. T=normrnd(0.6,0.1,1000);

  39. for i=1:1:1000
  40.     w(i,1)=10;
  41. end

  42. for i=1:1:80
  43.         for j=1:1:1000
  44.             for k=1:1:250
  45.             if sqrt((pos(j,1)-pos1(k,1))*(pos(j,1)-pos1(k,1))+(pos(j,2)-pos1(k,2))*(pos(j,2)-pos1(k,2)))<1/201
  46.                 if rand(1)<T(j,1)
  47.                 w(j,1)=2*w(j,1);
  48.                 GN(j,1)=GN(j,1)+1;
  49.                 end
  50.             end
  51.             end
  52.             for k=1:1:250
  53.             if sqrt((pos(j,1)-pos2(k,1))*(pos(j,1)-pos2(k,1))+(pos(j,2)-pos2(k,2))*(pos(j,2)-pos2(k,2)))<1/201
  54.                 w(j,1)=0.5*w(j,1);
  55.                 BN(j,1)=BN(j,1)+1;
  56.             end
  57.             end
  58.         end
  59.     for m=1:1:250
  60.         [pos1(m,1),pos1(m,2)]=move(pos1(m,1),pos1(m,2));
  61.     end
  62.     for m=1:1:250
  63.         [pos2(m,1),pos2(m,2)]=move(pos2(m,1),pos2(m,2));
  64.     end
  65. end

  66. figure(2);
  67. i=1:1:1000
  68. plot(i,w(i,1),'b')
  69. title('财富分布图');
  70. xlabel('人员');
  71. ylabel('财富');

  72. figure(3);
  73. q=1:1:1000
  74. plot(q,T(q,1),'b')
  75. title('天赋分布图');
  76. xlabel('人员');
  77. ylabel('天赋');

  78. [b,in]=sort(w);
  79. Totalw=sum(w);
  80. Partw=sum(b(801:1000,:),1);
  81. P=Partw/Totalw;
  82. disp('******');
  83. disp(P);
  84. disp('******');

  85. disp(w(in(1000),1)),disp(T(in(1000),1)),disp(GN(in(1000),1)),disp(BN(in(1000),1));disp('******');
  86. disp(w(in(999),1));disp(T(in(999),1));disp(GN(in(999),1));disp(BN(in(999),1));disp('******');
  87. disp(w(in(998),1));disp(T(in(998),1));disp(GN(in(998),1));disp(BN(in(998),1));disp('******');
  88. disp(w(in(997),1));disp(T(in(997),1));disp(GN(in(997),1));disp(BN(in(997),1));disp('******');
  89. disp(w(in(996),1));disp(T(in(996),1));disp(GN(in(996),1));disp(BN(in(996),1));


  90. function  [X,Y]=move(x,y)
  91. r=1.5/201;
  92. theta=randn(1)*pi;
  93. while theta>pi || theta<-pi
  94. theta=randn(1)*pi;
  95. end
  96. X=x+r*cos(theta);
  97. if X>1
  98.     X=x-r*cos(theta);
  99. end
  100. if X<-1
  101.     X=-r*cos(theta)-x;
  102. end
  103. Y=y+r*sin(theta);
  104. if Y>1
  105.     Y=y-r*sin(theta);
  106. end
  107. if Y<-1
  108.     Y=-r*cos(theta)-y;
  109. end
  110. end
复制代码

全部资料51hei下载地址:
帕累托定律.zip (1.3 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表