第五章学习打卡
线性同余法:
X n + 1 = ( a X n + c ) m o d m X_{n+1} = (aX_n + c)\;mod\;m Xn+1=(aXn+c)modm
均匀分布
VC的rand()函数范围是[0,32767],如何取得一个[0,9999]的随机数
- x = rand % 10000的问题
- 拒绝采样法 如果取到超过三万,重新取一次
- 方法1: x = rand() * (RAND_MAX+1) + rand()
- 方法2:用梅森旋转
如何取得一个0~1的随机浮点数
- 方法1:x = rand()/(float)RAND_MAX
- 方法2:
针对浮点数的存储格式来生成,随机填充尾数域得[1,2)范围的随机数,指数域写死,对尾数域进行0或1的填充,最后减一即可
Box-Bullet算法
- 选取两个服从[0,1]上均匀分布的随机变量U1、U2,使X,Y满足
X = c o s ( 2 π U 1 ) − 2 l n U 2 Y = s i n ( 2 π U 1 ) − 2 l n U 2 X=cos(2{\pi}U_1)\;{\sqrt[]{-2lnU_2} }\\ Y=sin(2{\pi}U_1)\;{\sqrt[]{-2lnU_2} } X=cos(2πU1)−2lnU2Y=sin(2πU1)−2lnU2
- 则X与Y服从均值为0,方差为1的高斯分布
基于中心极限定理采样
- 生成n个独立同分布的随机变量,求和即可
- 当n趋近于无穷大时,它们和的分布都会趋近正态分布
形状采样
取得在圆形内均匀分布的点
- 1.拒绝采样
- 2.极坐标采样
x = s q r t ( r ) ∗ s i n ( t h e t a ) y = s q r t ( r ) ∗ c o s ( t h e t a ) x=sqrt(r)*sin(theta)\\ y=sqrt(r)*cos(theta) x=sqrt(r)∗sin(theta)y=sqrt(r)∗cos(theta)
洗牌算法:
- 1.选中1个元素,将其与n个元素中的任意一个交换(包括第1个元素自己)。这时排序后的第1个元素已经确定。
- 2.选中第2个元素,将其与n-1个元素中作任意一个交换(包括第2个元素自己)。
- 3.重复上面步骤,直到剩1个元素为止。