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

news/2025/2/22 19:49:40

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

文章目录

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

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

一、模拟

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

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

1.1 模拟

// go
package main

import (
	"fmt"
	"math"
	"math/rand"
	"slices"
)

func main() {
	times := 1
	const PersonCnt = 100
	const InitMoney = 100
	persons := make([]int, PersonCnt) // 下标: 第几个人, 值: 该人有的钱数
	for i := range persons {
		persons[i] = InitMoney
	}
	// t := 0
	for range times { // 每轮
		// fmt.Printf("开始第%v轮\n", t)
		// t++
		for i, money := range persons { // 每个人
			if money == 0 {
				continue // 若该人已没钱了, 则不用给别人了
			}

			other := i
			for 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.0
	sum := 0
	n := 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.niftyadmin.cn/n/5862702.html

相关文章

【护网行动-红蓝攻防】第一章-红蓝对抗基础 认识红蓝紫

1.实战攻防演练 1.1为什么要进行实战攻防演练? 军事上的演练,是除了实战以外最能检验军队战斗力的一种考核方式,他可以模拟面对外部势力的攻击时候,如何更好的去维护国家和主权的安全。同样的,在网络上面,…

黑客疑入侵OmniGPT:3400万用户数据遭泄露

一名黑客声称已成功入侵 OmniGPT——一个由人工智能驱动的知名聊天机器人和生产力平台。此次事件导致3万名用户的电子邮件、电话号码以及超过 3400 万条(34270455)用户对话被泄露。这些数据由一位化名为“Gloomer”的黑客于2月9日上午在 Breach Forums 上…

Promptic:Python 中的 LLM 应用开发利器

Promptic 是一个基于 Python 的轻量级库,旨在简化与大型语言模型(LLMs)的交互。它通过提供简洁的装饰器 API 和强大的功能,帮助开发者高效地构建 LLM 应用程序。Promptic 的设计理念是提供 90% 的 LLM 应用开发所需功能,同时保持代码的简洁和易用性。 1. Promptic 的核心…

鸿蒙开发环境搭建-入门篇

本文章讲述如何搭建鸿蒙应用开发环境:新建工程、虚拟机运行、真机调试等。 开发工具: DevEco Studio 5.0.3.906 os系统: mac 参考文档:https://juejin.cn/post/7356143704699699227 官网鸿蒙应用开发学习文档:https://developer.huawei.com/c…

这个TensorFlow是一个开源的机器学习框架,怎么用

使用TensorFlow进行机器学习可以分为以下几个步骤: 安装TensorFlow:首先需要在你的机器上安装TensorFlow。可以通过pip命令来安装TensorFlow:pip install tensorflow。 准备数据:准备用于训练和测试的数据集。TensorFlow支持多种…

鸿蒙-状态管理V1

目录 前言状态管理V1State装饰器初始化观察能力小坑 Prop装饰器 和 Link装饰器Observed装饰器和ObjectLink装饰器使用示例小结 前言 随着鸿蒙Next的推广,做鸿蒙开发的人是越来越多,提问和寻求帮助的人也是越来越多,就我自己回答的问题而言&a…

排序与算法:插入排序

执行效果 插入排序的执行效果是这样的: 呃……看不懂吗?没关系,接着往下看介绍 算法介绍 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据&#xff0c…

计算机视觉(CV)

计算机视觉(CV)技术是人工智能(AI)领域的一个重要分支,其优势和挑战如下所示: 优势: 自动化处理:CV 技术可以自动处理大量图像和视频数据,实现高效的信息提取和分析&am…