前置知识:掌握一门语言

先来个有意思的实验

一开始有 100 个人,每个人都有 100 元

在每一轮都做如下的事情:

每个人都必须拿出 1 元钱给除自己以外的其他人,给谁完全随机

如果某个人在这一轮的钱数为 0,那么他可以不给,但是可以接收

发生很多很多轮之后,这 100 人的社会财富分布很均匀吗?

既然是程序员,当然用代码做实验啊

基尼系数:

一个社会的基尼系数是一个在 0~1 之间的小数,基尼系数为 0 代表所有人的财富完全一样,基尼系数为 1 代表有 1 个人掌握了全社会的财富,基尼系数越小,代表社会财富分布越均衡;越大则代表财富分布越不均衡。

在 2022 年,世界各国的平均基尼系数为 0.44,目前普遍认为,当基尼系数到达 0.5 时,就意味着社会贫富差距非常大,分布非常不均匀,社会可能会因此陷入危机,比如大量的犯罪或者经历社会动荡

package main
 
import (
  "fmt"
  "math"
  "math/rand"
  "sort"
)
 
func main() {
  n := 100
  t := 1000000
  fmt.Printf("人数:%d,轮次:%d\n", n, t)
 
  wealths := make([]float64, n)
  for i := range wealths {
    wealths[i] = 100
  }
 
  for ; t > 0; t-- {
    for i, wealth := range wealths {
      if wealth > 0 {
        // 使用 globalRand 生成随机数
        other := rand.Intn(n)
        for other == i {
          other = rand.Intn(n)
        }
        wealths[i]--
        wealths[other]++
      }
    }
  }
 
  sort.Float64s(wealths)
  fmt.Println("列出每个人的财富(贫穷到富有):")
  fmt.Println(wealths)
  fmt.Println("这个社会的基尼系数为:", calculateGini(wealths))
}
 
func calculateGini(wealths []float64) float64 {
  var (
    sumOfAbsoluteDifferences float64
    sumOfWealth              float64
  )
 
  for _, v1 := range wealths {
    sumOfWealth += v1
    for _, v2 := range wealths {
      sumOfAbsoluteDifferences += math.Abs(v1 - v2)
    }
  }
 
  return sumOfAbsoluteDifferences / (2 * float64(len(wealths)) * sumOfWealth)
}
人数:100,轮次:1000000
列出每个人的财富(贫穷到富有): 
[0 0 2 3 3 5 7 7 9 9 10 12 13 13 14 14 18 20 23 24 24 25 25 25 26 26 28 30 31 32 34 37 38 40 40 41 41 42 54 55 56 56 59 61 62 66 68 72 73 74 79 84 86 87 89 90 91 92 97 98 102 105 106 106 110 119 119 119 120 135 138 140 141 142 144 148 152 154 155 157 161 175 176 180 182 187 206 213 224 227 227 228 239 239 276 289 295 316 453 455]
这个社会的基尼系数为: 0.48324
人数:100,轮次:1000000
列出每个人的财富(贫穷到富有): 
[0 1 3 4 4 5 6 7 8 8 9 10 12 14 15 16 18 19 22 24 24 25 25 26 26 26 29 29 29 32 38 40 40 42 43 44 44 45 47 52 53 60 60 60 62 66 66 69 71 72 72 74 76 78 79 82 83 84 85 86 88 93 100 100 101 101 103 104 106 107 114 115 126 131 135 135 139 140 147 155 158 165 175 186 201 203 209 223 227 235 235 247 256 275 278 291 331 336 363 717]
这个社会的基尼系数为: 0.504494

学习算法入门提醒

  1. 善于、乐于折腾。勤写代码找到乐趣,只看课没有用。看懂了一定要确保自己手写正确,再继续下个内容
  2. 算法的学习节奏,不像大学,像高中。区别是一个为了应试,一个在磨练手艺,代码人就是手艺人
  3. 关于复习,尽量冲击到一定的题量再整体复习,不要频繁复习,会拉长周期,而且很多是无效的复习