现代计算机蠕虫病毒传播途径多样化,除了利用移动介质如U盘等传播外,还可以通过邮件、网页挂马、聊天工具、文件传输等多种方式传播,一些病毒甚至可以利用系统的某些漏洞自动进行传播。中毒的主机会自动搜索可以被感染的主机,并将蠕虫病毒扩散开来。一台没有安装系统补丁、无安全防护软件的计算机连接到internet上,即使用户不做任何操作,只要网络是通的,在5分钟之内几乎必定会感染上蠕虫病毒。下图是一个著名的病毒--红色代码在某天内传播感染计算机的情况。
红色代码病毒的传播图
各种各样的蠕虫病毒在Internet上进行传播,大量的主机被感染,新的病毒又在不断出现。这种现象与人类社会所面临的传染病流行的情形类似。它们都可以用一个简单的数学模型来描述。
式中N是表示所有的可能被感染的群体数量,是已经被感染上病毒的个体所占的比例,K是一个常数,表示在一个时间段内某个病毒携带者(或感染病毒的计算机)能够传染其他的个体数量。对于一个足够小的时间,新增加的被感染个体数等于已经感染的数量和可被感染的的乘积。这是一个微分公式。
我们往往关心的是被感染的主机比例随着时间的增长变化的情况。对上面的公式积分后得到如下的结果:
这个式子中的T是一个积分常量,代表病毒的爆发期时刻。如下图的示例,传染能力(即在一段时间内一台感染病毒的个体可以再感染的主机的多少)的度量值K=2.6。病毒的爆发期时间T=5.52。在5.52小时之前,病毒的传播速度还比较慢,接近该时刻后,病毒感染了大量的主机,并且传播的速度也越来越快,最后几乎感染了所有的主机,再传播的速度也开始变慢了。前面红色代码病毒的传播图也表明了这个特点。这个公式有一个著名的名称:罗杰斯特方程(logistic equation)。
logistic equation
参考文献:
如何在你的空闲时间占领整个互联网:How to 0wn the Internet in Your Spare Time
一些病毒传播的动画:http://www.caida.org/publications/animations/#security
=====
本题的目的要求你实现logistic方程,对不同的输入参数,计算某些特定时刻的函数值。
输入:
参数K和T,以及用起始时刻ts,终止时刻te和增量dt表示的一个时间区间[ts,te)。包含ts,但不含te。
输出:
对应各个时刻点的感染个体的比例,用空格进行分隔,每10个数据后换行。最后一行如果不够10个数据也要换行。(补充:可能出现(te-ts)/dt不是整数的情形,要注意是否应该取最后那个点)
输出数据请采用格式化字符串" %4.3f",即每个数据之前放置一个空格,数据保留小数点后三位有效数字。
样例输入:
2.6□5.52↵
0□8□0.1↵
样例输出:
□0.000□0.000□0.000□0.000□0.000□0.000□0.000□0.000□0.000□0.000↵
□0.000□0.000□0.000□0.000□0.000□0.000□0.000□0.000□0.000□0.000↵
□0.000□0.000□0.000□0.000□0.000□0.000□0.001□0.001□0.001□0.001↵
□0.001□0.002□0.002□0.003□0.004□0.005□0.007□0.009□0.011□0.015↵
□0.019□0.024□0.031□0.040□0.052□0.066□0.084□0.106□0.133□0.166↵
□0.206□0.251□0.303□0.361□0.423□0.487□0.552□0.615□0.674□0.729↵
□0.777□0.819□0.854□0.884□0.908□0.927□0.943□0.956□0.965□0.973↵
□0.979□0.984□0.987□0.990□0.993□0.994□0.996□0.997□0.997□0.998↵
注意:(循环变量应使用整数类型)
import java.util.Scanner;
/*
* 病毒扩散程序
* 参数K和T,以及用起始时刻ts ,终止时刻te 和 增量dt表示的一个时间区间[ts ,te )。包含ts ,但不含te
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double K = scanner.nextDouble();
double T = scanner.nextDouble();
int ts = scanner.nextInt();
int te = scanner.nextInt();
double dt = scanner.nextDouble();
double a;
int len = 0;
for(int i=0;(ts+i*dt)<te;i++){
a = Math.exp(K*((ts+i*dt)-T))/(1+Math.exp(K*((ts+i*dt)-T)));
System.out.printf(" %4.3f",a);
len++;
if(len==10){
System.out.println();
len = 0;
}
}
if(len != 0){
System.out.println();
}
}
}