这两天,一个视频火了起来。

视频地址:

https://www.bilibili.com/video/av86478875/

这是一个使用 Java 语言编写的肺炎仿真程序,从统计学的角度来说,能够从一定程度上模拟新冠肺炎病毒扩散及被控制的趋势。

现在,作者已经将代码开源到 GitHub 上,笔者特此 download 下来与诸君分享。

GitHub 地址:

https://github.com/KikiLetGo/VirusBroadcast

在代码中,我们假定一个城市是一个 600 x 600 的正方型。在这个城市中,每一个人为一个 3*3 大小的圆形的点。在每一个城市中,人口所在位置在统计学上都有相应的规律。在这里,假定城市中有 5000 个人,这 5000 个人以城市中心按照正态分布的方式,随机地分布在城市的各个角落。

城市中人口正态分布情况

代码如下:

Random random = new Random();
int x = (int) (100 * random.nextGaussian() + city.getCenterX());
int y = (int) (100 * random.nextGaussian() + city.getCenterY());
Person person = new Person(city, x, y);

在新型肺炎期间,根据肺炎的信息,我们可以知道,病毒存在潜伏期,医院会对患者进行收治。本文中我们对每一个人的状态进行简化,分为以下四个状态:

  • 正常

  • 潜伏期

  • 确诊

  • 在医院治疗中

其中三个状态中,人是可以自由活动的,当然,关于人的移动,此处的处理逻辑也是简化为一个正态分布的随机移动。以下代码为人随机移动到的目的地的位置:

// 根据流动意愿计算当前人是否需要流动
public boolean wantMove() {double value = sig * new Random().nextGaussian() + Constants.u;return value > 0;
}
// 计算人流动到的目标位置
double targetX = targetSig * new Random().nextGaussian() + targetXU;
double targetY = targetSig * new Random().nextGaussian() + targetYU;
moveTarget = new MoveTarget((int) targetX, (int) targetY);

除了处理分配位置和随机移动,还有一个被感染的函数。当我们在城市中移动的时候,当周围的人存在携带病毒的人,我们就有一定的概率被感染,以下代码描述了这个过程:

float random = new Random().nextFloat();
if (random < Constants.BROAD_RATE && distance(person) < SAFE_DIST) {this.beInfected();
}

当然,医院和国家的响应,会让我们在感染数上升的同时,避免外出,所以在计算人移动的过程中,添加一个辅助变量来表示人外出移动的意愿,随着感染数的上升,人们的移动意愿就会逐渐降低,为了简化程序,笔者在此添加了一个线性变化的流动意愿修改。随着床位被占据得越来越多,人们的流动意愿就越来越低。

public int usedBed() {int result = 0;for (Bed bed : beds) {if (!bed.isEmpty()) {result++;}}return result;
}// 更新流动意向
public void updateU() {int subCount = Constants.BED_COUNT / 5;int used = usedBed();if (used > subCount) {Constants.u = -0.99f;}float mu = 1.98f * used / subCount;Constants.u = 0.99f - mu;
}

下列动图就是从最开始很小一部分感染群体在不断地流动中所带来的大规模扩散模拟,当政府进行管控,外出人员大幅减少之后,整个疫情得到了有效的控制的演示,我们可以明确地得出一个结论,那就是「不出门、不串门」是非常行之有效的举措。正如 UP 主在视频最后所说的那句话 —— 「对本次疫情起到主导作用的,恰恰就是我们普普通通的每一个人」。

疫情肆虐下,程序员用代码告诉你为什么千万不要出门!相关推荐

  1. 程序员除了代码还应该有什么

    程序员除了代码还应该有什么 目录 程序员除了代码还应该有什么 前言 正文 职业方面的建议 自我营销的建议 学习的建议 生产力的建议 理财的建议 健身的建议 精神方面的建议 结束语 前言 看了<软 ...

  2. 开源浪潮下程序员的职业规划和成长

    无论从年初开源社发布的<2020 中国开源年度报告>还是整体的大环境,不难看到中国的开源正在崛起,越来越多的来自中国的开源项目和开发者们正在走入大家的视野.在开源浪潮的大趋势下,程序员又该 ...

  3. 程序员与代码的几种关系,每种都会被我们鄙视

    全世界只有3.14 % 的人关注了 数据与算法之美 程序员很大部分时间都在和代码打交道,所以程序员和代码之间的关系,在很多常人看来,是无法理解的,下面我们就来聊聊. 找到你仅仅是为了将你消灭掉 在程序 ...

  4. 优秀 Java 程序员写代码的风格

    转载自 涨姿势 | 优秀 Java 程序员写代码的风格 今天突发奇想,对编码习惯和 编程风格 很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助! ...

  5. 程序员与代码之间的搞笑日常,笑的人肚子痛

    一:程序员面试篇 面试官:"熟悉哪种语言". 应聘者:"JAVA". 面试官:"知道什么叫类么". 应聘者:"我这人实在,工作努力 ...

  6. 程序员写代码的致命缺点

    Table of Contents 一.命名不规范 二.日志不规范 三.拒绝写接口和假数据 四.不写单元测试 五.先集成,再测试,再放弃. 六.理不清楚逻辑,边做边猜 七.不做方案 八.不关注性能 九 ...

  7. 程序员的代码为什么永远写不完?

    程序员和常人有着什么样的区别?是否所有的程序员都是天然呆?为何女性程序员的人数要远远少于男性?在本文中,我们将带着种种疑问深入探讨计算机程序员中的文化. 作者 | Jennifer Ouellette ...

  8. 乐鑫Esp32学习之旅 22 讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等,附带Demo;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  9. 程序员与代码之间的搞笑日常,笑的人肚子痛!

    一:程序员面试篇 面试官:"熟悉哪种语言". 应聘者:"JAVA". 面试官:"知道什么叫类么". 应聘者:"我这人实在,工作努力 ...

最新文章

  1. Java IO系列之字节流拷贝文件性能比较
  2. 基于cookie的SSO单点登录系统
  3. GetCurrentDirectory和SetCurrentDirectory函数
  4. 在 Docker 上运行一个 RESTful 风格的微服务
  5. YUI事件体系之Y.Do
  6. 基于jedis的Redis工具类
  7. ZOJ 1234 UVA 10271 Chopsticks
  8. 中国程序员不得不使用的php框架,堪称不得已?
  9. Web 前端小白入门(一):心路历程,非技术指南
  10. ROS:ModuleNotFoundError: No module named ‘rospkg‘
  11. TarBase:有实验数据支持的miRNA靶基因数据库
  12. windows7计算机图片,win7照片查看器无法显示图片计算机可用内存不足 需要技巧...
  13. Bentley MicroStation CE版的颜色变换(CONNECT Edition)
  14. 1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)
  15. GB28181 协议实现H5无插件RTMP/HTTP-FLV/HLS直播监控方案 - sfxlab
  16. php tree view,VB.Net树视图(TreeView)
  17. 利用米筐量化回测平台实行量化炒股
  18. 3分钟教你图解Bitmap编码传输
  19. vue-amap实现实现初始化并定位当前位置,搜索,定位,增加点标记
  20. 乐观,积极,踏实,静心,排解

热门文章

  1. js获取网页高度和宽度(备份)
  2. angularJs为什么在近几年风头一时无二?
  3. Java_模拟comet的实现
  4. C/C++ 实现文件透明加解密
  5. 一些知名科技公司的开源机器学习框架/平台
  6. 矩池云上使用nvidia-smi命令教程
  7. android快速搭建界面,怎么样能快速搭建一个Android APP的界面和框架?
  8. resolving xxx failed: Temporary failure in name resolution解决
  9. 计算机控制系统的实时控制应用,计算机控制系统实时性的提高策略
  10. yii配置mysql_YII2中配置MySQL读写分离