腾讯游戏学院 游戏程序设计第五章(个人总结)——随机数在游戏中的应用

第五章学习打卡

线性同余法:

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)2lnU2 Y=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个元素为止。
    在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lr_shadow/article/details/107236949