文章目录
憋疯了?在家宅不下去了?想出去透透气了?
千万别!
虽然你对疫情已经麻木了,觉得没什么大碍了。
但现实并非如此,抗疫战斗仍在继续,还没有达到钟南山等专家所说的爆发期。
如果大家现在要是出门,真的是在疫情防控添乱!
不信?一名程序员,连夜打造的计算机仿真程序,模拟新冠病毒传播,在B站上播放量已达到数百万:
视频链接:
https://www.bilibili.com/video/av86478875
它告诉我们:
如果现在出门逛,迎接我们的,就是疫情越来越难控制的局面。
本文对火爆B站的仿真程序进行了深度解读:
一、JFrame面板组件布局
二、数学概念:高斯(正态)分布
为什么要讲高斯分布?
病毒传播代码最精华部分,最精彩部分,最能体现仿真模拟的就是这个高斯分布的代码,在本章尽量也最简单的话语为大家简单的介绍一下高斯分布的理论。
2.1 高斯分布概念
一个非常常见的连续概率分布。正态分布在统计学上十分重要,经常用在自然和社会科学来代表一个不明的随机变量。
例如说人的体重、身高、某种疾病的患病年龄、城市人口的分布,基本都是符合高斯分布的统计学应用。高斯分布的公式为:
纵观整个高斯公式,有两个很重要的参数:μ(可以谐音为 “谬”),σ(发音为sigma);那么跟大家解释一下μ为平均值,σ为标准差。
标准差决定了整个样本数据的分布密度,标准差越小,数据越集中,如下图非常直观的描述的μ与σ的关系,以及σ对整个概率分布的影响。
另外,如果μ=0, σ=1的时候,就称之为标准高斯分布。而X轴落在整个⾼斯曲线内的值,专业的说法为服从高斯分布。
2.2 正态变量的标准化
正态变量的标准化是高斯公式的一个重要推导,这里直接给出结论:
v 为服从高斯分布的数据
σ 为标准差
μ 为平均值
W 对v进行标准化处理后的数据,依然是服从高斯分布的
正态变量的标准化公式:
W = (V - μ) / σ
那么V值的计算公式为:
V = W * σ + μ
2.3 高斯分布在Java中的应用
java.util.Random函数有个方法叫做nextGaussian()函数,定义如下:
/*
* @return the next pseudorandom, Gaussian ("normally") distributed
* {@code double} value with mean {@code 0.0} and
* standard deviation {@code 1.0} from this random number
* generator's sequence
*/
synchronized public double nextGaussian() {
// See Knuth, ACP, Section 3.4.1 Algorithm C. if (haveNextNextGaussian) {
haveNextNextGaussian = false; return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1 and 1
v2 = 2 * nextDouble() - 1; // between -1 and 1 s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s); nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
根据API的描述:返回一个double类型的值,这个值服从均值为0,均方差为1的标准正态分布。
然后根据正态变量的标准化推导公式:、
double value = sigma * new Random().nextGaussian() + 0.99;
三、核心代码解读
3.1启动类函数:
3.2画布相关代码
初始化画布:
如上图所示的MyPanel 类实现了Runnable接口: