流行病是一系列随机事件
S公司 未感染但 秒 易感染 E类 已感染,但尚未感染( e(电子) 暴露) A类 感染,但尚未出现症状( 一 有症状的) 我 有感染性且有症状 R(右) 已被感染或无法感染(例如通过接种疫苗)
正在生成联系人
定义p_random(): x=随机() #这是内置的随机数生成器 s=0 i=0 而s<=x: i+=1 s+=p[i] #出口p[0]+…+ p[i-1]<=x<p[i] 返回i-1
沃克的诡计
从某种盒子开始。 将其划分为较小的带标签的框,使框$k$的面积与$p_{k}$成比例。 要生成具有给定概率分布的整数,请在框内随机选择点,并返回命中区域的标签。 安排一种方式,为$[0,1)$中的每个随机$x$分配方框中的一个点。
完整的算法
定义初始化(p): l=0 s=0 [0] 对于范围(n)内的i: 如果p[i]>1/n: 大[l]=i l+=1 其他: 小[s]=i s+=1 [1] 当s>0和l>0时: s-=1 j=小[s] l-=1 k=大[l] prob[j]=n*p[j] 别名[j]=k p[k]+=(p[j]-b) 如果p[k]>b: 大[l]=k l+=1 其他: 小[s]=k s+=1 [2] 当s>0时: s-=1 prob[small[s]]=1 [3] 当l>0时: l-=1 prob[大[l]]=1 定义p_random(): x=n*随机(0,1) m=地板(x) 如果(x-m)<prob[m]:返回m else:返回别名[m]
模拟
进一步阅读
Keith Schwartz关于 飞镖的别名算法 。我从这个详尽的处理中获得了Walker算法的图形解释。 阿拉斯泰尔·沃克, 生成一般分布离散随机变量的一种有效方法 ,ACM数学软件交易 三 , 1977. 迈克尔·沃斯, 生成给定分布随机数的线性算法 IEEE软件工程汇刊 17 , 1991. 唐纳德·科努特, 计算机编程艺术,第二卷 关于半数值算法。 第3.4节讨论了生成具有给定概率分布的随机数的问题。 大卫·奥斯汀, 没有任何机会 解释计算机如何生成均匀分布(伪)随机数。 Python代码 对于 初始化 和 p_随机 。