【算法】002、编程实现社会问题

news/2025/2/23 2:21:49/

算法】002、编程实现社会问题

文章目录

  • 一、模拟
    • 1.1 模拟
  • 二、多语言解法

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

一、模拟

初看题目, 觉得很公平, 但程序员是手艺人, 尽量建模并用代码模拟一遍, 看看实际效果

思路:
初始: 模拟100个人, 每个人有100元
操作 t 轮, 每轮 每个人 只要有钱就要给 别人 1元. 若某人已没钱了则不用给但是可以接收.
求: t 轮之后, 100人的财富分布.
可以让 t = 1, 10, 100, 1000 分别看看效果, 看看是否公平.

1.1 模拟

// go
package mainimport ("fmt""math""math/rand""slices"
)func main() {times := 1const PersonCnt = 100const InitMoney = 100persons := make([]int, PersonCnt) // 下标: 第几个人, 值: 该人有的钱数for i := range persons {persons[i] = InitMoney}// t := 0for range times { // 每轮// fmt.Printf("开始第%v轮\n", t)// t++for i, money := range persons { // 每个人if money == 0 {continue // 若该人已没钱了, 则不用给别人了}other := ifor other == i { // other 是其他人, 初值为 i. 循环直到 不为i 为止other = rand.Intn(PersonCnt)}// oldi, oldOther := persons[i], persons[other]persons[i]--persons[other]++// fmt.Printf("%v(%v) 给 %v(%v) => (%v) (%v)\n", i, oldi, other, oldOther, persons[i], persons[other])}}fmt.Println(slices.Sorted(slices.Values(persons)))fmt.Printf("%v轮, 基尼系数%v\n", times, geni(persons))
}func geni(wealth []int) float64 {diffs := 0.0sum := 0n := len(wealth)for i := range n {sum += wealth[i]for j := range n {diffs += math.Abs(float64(wealth[i] - wealth[j]))}}return diffs / float64(2*n*sum)
}

每轮明细:

开始第0轮
0(100)64(100) => (99) (101)
1(100)57(100) => (99) (101)
2(100)20(100) => (99) (101)
3(100)29(100) => (99) (101)
4(100)31(100) => (99) (101)
...
95(102)11(99) => (101) (100)
96(101)18(99) => (100) (100)
97(102)58(99) => (101) (100)
98(102)8(100) => (101) (101)
99(101)60(101) => (100) (102)

一轮之后

[99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102 102 102 102 103 103 105]
1轮, 基尼系数0.005436

十轮之后

[92 94 94 94 95 96 96 96 96 97 97 97 97 97 97 97 97 97 97 97 97 97 97 98 98 98 98 98 98 98 98 98 98 98 98 99 99 99 99 99 99 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102 102 102 102 102 102 102 102 102 103 103 103 103 103 103 104 104 104 104 104 105 106 106 106 106 107 107 107]
10轮, 基尼系数0.01732

百轮之后

[79 81 81 83 85 87 88 88 89 89 89 90 90 90 91 91 92 92 92 93 93 93 93 93 94 94 94 94 95 95 95 95 95 96 96 96 96 96 96 96 97 97 97 97 97 98 98 98 98 99 99 99 99 99 100 100 100 100 100 100 100 100 101 101 101 102 103 103 104 104 104 104 105 105 105 105 105 106 106 106 106 107 108 108 108 109 109 111 113 115 115 117 117 118 118 123 124 124 125 128]
100轮, 基尼系数0.053774

千轮之后

[26 30 35 36 39 43 48 49 52 53 57 58 59 61 62 65 65 67 70 72 72 73 73 73 75 76 77 79 81 82 82 84 86 87 88 89 89 90 92 92 93 93 96 97 98 98 99 100 100 100 100 101 101 102 103 104 104 106 106 109 109 111 113 113 114 114 114 115 117 118 118 119 119 121 121 122 123 126 128 128 129 129 130 131 133 133 133 136 143 144 146 146 153 159 160 165 165 166 167 172]
1000轮, 基尼系数0.190358

万轮之后

[0 2 2 4 4 8 9 11 11 14 14 17 17 22 28 29 31 31 33 34 35 37 38 38 40 40 40 45 45 46 46 48 49 51 52 53 54 56 56 56 59 60 66 69 70 71 75 77 84 87 89 96 96 97 97 98 99 102 104 104 104 105 107 112 116 118 118 119 122 123 125 128 132 143 147 148 149 152 157 163 164 174 176 180 183 185 190 200 206 207 209 214 214 219 233 255 262 304 334 357]
10000轮, 基尼系数0.420522

百万轮之后

[3 4 4 5 6 9 10 11 11 11 14 14 14 15 15 16 16 19 20 20 21 21 22 24 24 25 26 26 26 26 27 30 30 31 32 34 35 36 36 36 38 38 38 39 40 40 45 47 50 51 59 59 61 62 67 70 71 77 80 82 84 96 98 98 100 104 107 107 108 111 121 122 134 138 151 162 162 167 171 173 175 180 190 193 208 212 222 223 237 245 255 289 296 296 297 305 368 380 461 535]
1000000轮, 基尼系数0.535876

因此, 通过实际编码可知, 随着轮数变多, 财富分布会越来越不均衡. 逐渐超过 0.5 的阈值

二、多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

// cpp
// go 同上
# python
// rust
// js
// ts

http://www.ppmy.cn/news/1574302.html

相关文章

unplugin-vue-components,unplugin-auto-import,借用ai去学习

好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先&#xff…

人工智能泡沫效应

1.1 泡沫效应的经济学解释 泡沫效应是指资产价格持续超出其内在价值的现象,通常由过度投机、市场预期不合理等因素引起。在经济学中,泡沫的形成往往伴随着资产价格的快速上涨,而这种价格上涨并非基于基本面的支撑,而是由于投资者…

基本认证 vs OAuth 2.0 vs OpenID Connect

目前 Authing 有三种可以选择的认证方式: 基本认证是基于 API 接口,通过发送账密、手机验证码到 服务器 后端的方式直接完成用户认证。提供 MFA、忘记密码等功能。 OAuth 2.0 协议主要用于资源授权。 OpenID Connect 协议,简称 OIDC,是 OAuth 2.0 协议的超集,能够认证用户…

QPainter绘制3D 饼状图

先展示图片 核心代码如下&#xff1a; pie.h #ifndef Q3DPIE_H #define Q3DPIE_H#include <QtGui/QPen> #include <QtGui/QBrush>class Pie { public:double value; QBrush brush; QString description; double percentValue;QString p…

【云安全】云原生- K8S 污点横移

什么是“污点横移”&#xff1f; 在 K8S 中&#xff0c;利用污点&#xff08;Taint&#xff09;进行横向移动渗透是指攻击者通过操纵或绕过集群中的污点和容忍&#xff08;Toleration&#xff09;机制&#xff0c;将恶意负载&#xff08;Pod&#xff09;调度到原本受保护的节点…

普通人使用生成式语言模型的几个阶段

随着生成式语言模型&#xff08;如 ChatGPT、Grok 等&#xff09;逐渐走进大众生活&#xff0c;普通人从最初的懵懂尝试&#xff0c;到熟练运用&#xff0c;再到理性判断其输出结果是否可靠&#xff0c;经历了一个逐步进阶的过程。以下&#xff0c;我将详细描述普通人使用生成式…

二叉树层序遍历的三种情况(总结)

这道题就是一个比较简单的层序遍历&#xff0c;只需要利用队列存放二叉树结点&#xff0c;队列的size代表每层的节点数也就是平均值的除数&#xff0c;利用一个结果数组记录每层平均值&#xff0c;最后返回。 需要注意的是&#xff0c;平均值定义成double类型。 代码如下&…

一周学会Flask3 Python Web开发-flask3模块化blueprint配置

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们在项目开发的时候&#xff0c;多多少少会划分几个或者几十个业务模块&#xff0c;如果把这些模块的视图方法都写在app.py…