首页 > 编程知识 正文

随机数生成器的原理是什么,挑战算法中的随机数生成

时间:2023-05-03 12:46:09 阅读:107249 作者:2389

正文重点:

伪随机数生成线性同馀法(Linear Congruential Generator,LCG )载波乘法(MWC )广义环旋转算法蒙特卡罗法伪随机数生成算法的概念

种子(seed )“种子”决定了生成的随机数序列。 它还决定了内部状态的初始值。 对于给定的物种,总是得到相同的随机数序列,而大多数不同的物种会生成不同的随机数序列。

内部状态),由伪随机数生成算法用于生成随机数和下一个内部状态的多个变量构成。 如果知道内部状态和伪随机数生成器或密码学安全的伪随机数生成器的算法类型,就可以预测下一个随机数。

周期(period )各随机数序列的长度为“周期”。 如果超出周期范围,伪随机数生成器生成的值将开始重复。 因为伪随机数生成器所生成的值以恒定间隔或周期来重复,所以伪随机数生成器可以是周期函数。

虽然随机数分布类型的均匀分布通常希望所获得的随机数服从均匀分布,但伪随机数生成器通常也可确保生成在(0,1 )区间内具有相似性的随机数。 生成大量(0,1 )区间内的随机数的结果,如下图所示服从均匀分布。

随机数可分布在(0,1 )的范围内等,这种现象称为“均匀分布”或“均匀随机数”。 根据该分布,在特定区间内取任意值的可能性相等。

可以将得到的随机数缩放到任意目标区间。 定标方法与归一化方法有点相似。

rand(high,low )=rand ) * ) *(high-low ) low正态分布具有用于生成正态分布随机数的编程语言接口。

出现概率最大的随机数集中在0附近,其中没有明确的上限和下限。 每个整数表示一个标准差,随着标准差在正负两个方向上的逐渐增大,这些随机数的取值概率急剧下降,在区间(-4,4 )之外几乎什么也取不到。 正态分布随机数最常见的应用场景是通过增加小的随机偏移来改变数字。

语言为c # uniform : random.nextdoublenormal : NAC/C uniform : rand normal : najavauniform 3360 random.nextdoublenormal : random.nextgaussianpythonuniform 3360 random.random 3360rnorm轮盘模拟法这也是随机数案,只是该技术与赌场的实际轮盘有点相似。 通常,如果yldpd从三个或更多类别中选择,则需要此技术。

示例假设您要创建一个随机移动网格的机器人。 这个机器人只有以下三种行动能力

向左走,右转

也许并不希望因为机器人的行为是随机的,机器人采取这三种行为的可能性是均等的。 我更希望机器人以前进(80 )、左转(10 )、右转(10 )的分配比率行动

这样的随机数发生器很容易实现。 首先,需要对所有选择进行排序,使其分别占据[ 0,1 ]区间的某一部分,然后使用均匀分布的伪随机数生成算法生成[ 0,1 ]区间内的随机数。

假设x是随机数,如果if0x0.8 then move forward //小于0.8,则为80%if0.8x0.9thenmoveleft////0.8到0.9,则为10 % if 0.9 x 1.0 then move right

1 .线性同馀生成法形同馀生成法是历史最悠久、最常用的伪随机数生成算法,也是内置于C/C、Java、C#等语言中的伪随机数生成算法。

线性同余生成法不适用于随机性要求较高的应用场合,而且由于算法对序列的依赖性,线性同余生成法对蒙特卡罗方法通常用处不大(序列相关也称为“自相关”,指变量随时间的变化也会影响自身) 这意味着用线性同余生成法得到的随机数质量不太好,也不适用于密码学场景。

的实现使用受限于特定周期的线性函数

m 0m模块a 0am乘法因子c 0=c m增量X0 0=X0m种子或初始值

其中,“Xn”的值在每次生成随机数时更新。 在线性同余生成法中,下一个随机数生成过程的“Xn”值属于内部状态。 用这种方法得到的随机数都是整数,但只需将得到的随机数除以算法能生成的最大整数就可以将随机数转换为(0,1 )区间。 这个“算法能生成的最大整数”取决于m、a、c三个值。

m a c三方值对结果的随机性影响较大,许多研究发现各种最优值m=2e31

a=1103515245

c=12345

进位乘法进位乘数伪随机数生成算法是由复杂的未来Marsaglia创造的,其目的是

是生成周期很长的随机整数序列,其周期之长,最低约为260,最高可达22000000。该算法使用一个从2到数千内随机选取的数值作为初始种子,算法的主要优点在于它调用的是简单的计算机整数运算,可以以极快的速度产生随机数序列。
必须要定义一个变量r,用以描述进位乘数法中的“延迟”概念,并且必须提供r个值作为种子。

a为乘法因子,b为模数,此外还有一个表示进位的变量c。
进位计算方式如下:

变量n表示你当前所计算的数在序列中的序号,必须保证n不小于r,其原因在于n之前的x值会作为种子值,而我们共有r个x的初值作为种子。这个式子是需要向下取整。
进位乘数生成法所得结果的周期远长于线性同余生成法,并且其实现的执行速度还通常都特别快,相对于线性同余生成法来说更具竞争力。

大意的戒指旋转算法

大意的戒指旋转算法[插图]是由Makoto Matsumoto和Takuji Nishimura于1997年开发的伪随机数生成算法,可以以极快的速度生成高质量的伪随机整数。该算法的设计初衷是要解决已有算法的各种缺陷。
大意的戒指旋转算法是一种常用的伪随机数生成算法,也是Ruby、Python和R语言的内置伪随机数生成算法,可以生成适用于蒙特卡洛方法的高质量随机数。虽说大意的戒指旋转算法并非密码学意义上的安全随机数发生器,但其在运行速度和随机性上的优势依然使它在人工智能领域大受欢迎。
“大意的戒指旋转算法”这个名字来自于“该算法的周期总是一个大意的戒指素数”这么一个事实。
所谓“素数”,指的是只能被1和其本身整除的数,比如5就是一个素数。而大意的戒指素数则是满足 M n = 2 n − 1 M_n=2^n-1 Mn​=2n−1的素数
比如 2 5 = 31 , 32 − 1 = 31 2^5=31 , 32-1=31 25=31,32−1=31 31是一个素数并且满足上式,所以31是一个大意的戒指素数。

Box-Muller转换法

可以把均匀分布随机数转换为正态分布随机数的算法。因为并非所有编程语言都支持生成正态分布随机数。
设 X 1 , X 2 X_{1},X_{2} X1​,X2​ 是在[0,1)上遵从均匀分布的随机数(生成[0,1)上遵从均匀分布的随机数通常使用的是大意的戒指旋转算法),令

Y 1 = − 2 l n X 1 c o s ( 2 π X 2 )      Y 2 = − 2 l n X 2 c o s ( 2 π X 1 ) Y_{1}=sqrt{-2lnX_{1}}cos(2pi X_{2}), , , , Y_{2}=sqrt{-2lnX_{2}}cos(2pi X_{1}) Y1​=−2lnX1​ ​cos(2πX2​)Y2​=−2lnX2​ ​cos(2πX1​)
则 ( Y 1 , Y 2 ) T (Y_{1},Y_{2})^{T} (Y1​,Y2​)T 必然遵守二元正态分布,即利用两个独立的遵从均匀分布的随机数得到两个独立的正态分布的随机数

#include <iostream>#include <cmath>#include <cstdlib> using namespace std;const double pi = 3.1415926897932384;int main() {ios::sync_with_stdio(false);double x1, x2,y1,y2;int seed;//手动输入种子cout << "输入种子(任给整数)" << endl;cin >> seed;srand(seed);x1 = rand()% RAND_MAX /(double) RAND_MAX;x2= rand() % RAND_MAX / (double)RAND_MAX;cout << "产生的均匀分布的随机数种子为" << endl;cout << x1 <<" "<< x2 << endl;y1 = sqrt(-2 * log(x1))*cos(2 * pi*x2);y2 = sqrt(-2 * log(x2))*sin(2 * pi*x1);cout << "输出的正态分布的随机数为" << endl;cout << y1 << " " << y2 << endl;return 0;} 用蒙特卡洛方法估算PI值

由于很多情况下计算实际值会耗费大量时间,因此蒙特卡洛方法的思想是通过随机采样来对实际值进行估算,并且可以得到良好的估算结果。
蒙特卡洛方法的一个简单示例是用蒙特卡洛方法估算PI值。图4-4是一个内切于正方形的圆。

我们在正方形和圆形中随机放置一些点,利用圆内点比上正方形内全部点的比例就可以计算出PI值。正方形的面积等于长和宽的乘积,由于正方形长宽相等,实际上正方形的面积就是“宽乘宽”,或者说是“边长的平方”。圆形的面积公式为“PI乘以半径的平方”,而该圆直径又等于正方形边长。

tries = 0success = 0for i in from 0 to 1000{//随机取点x = rand()y = rand()tries = tries +1if(x*x+y*y<=1){success++}}pi = 4*success / tries

由此可以看出,随机的点越多,PI的估计值就越精确。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。