随机数生成算法

您所在的位置:网站首页 生成随机数字的软件有哪些免费 随机数生成算法

随机数生成算法

2024-07-13 20:02| 来源: 网络整理| 查看: 265

转自:https://www.cnblogs.com/ECJTUACM-873284962/p/6926203.html

1、蒙特卡罗法

  蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,数学家冯·诺依曼用闻名世界的赌城——蒙特卡罗命名(就是那个冯·诺依曼)。 蒙特卡罗方法解题过程的主要步骤: a.针对实际问题建立一个简单且便于实现的概率统计模型,使所求的量恰好是该模型的概率分布或数字特征。 b.对模型的随机变量建立抽样方法,在计算机上进行模拟测试,抽取足够多的随机数。 c.对模拟实验结果进行统计分析,给出所求解的“估计”。 d.必要时,改进模型以提高估计精度和减少实验费用,提高模拟效率。

2、冯▪诺依曼

  冯·诺依曼(John von Neumann,1903~1957),20世纪最重要的数学家之一,在现代计算机、博弈论和核武器等诸多领域内有杰出建树的最伟大的科学全才之一,被称为“计算机之父”和“博弈论之父”。主要贡献是:二进制思想与程序内存思想,当然还有蒙特卡洛方法。通过第一部分,可知,蒙特卡洛方法更多的是一种思想的体现(这点远不同于快排等“严格”类算法),下面介绍最常见的一种应用——随机数生成。

3、U(0,1)随机数的产生

  对随机系统进行模拟,便需要产生服从某种分布的一系列随机数。最常用、最基础的随机数是在(0,1)区间内均匀分布的随机数,最常用的两类数值计算方法是:乘同余法和混合同余法。 乘同余法:      这里写图片描述 其中, x0 x 0 被称为种子, M M 是模,rnrn是(0,1)区间的随机数。

混合同余法:      这里写图片描述 其中,C是非负整数。   这些随机数是具有周期性的,模拟参数的选择不同,产生的随机数质量也有所差异。更复杂的生成方法还有:      这里写图片描述

4、从U(0,1)到其它概率分布的随机数

(a)离散型随机数的模拟   设随机变量X的概率分布为: p(X=xi)=pi p ( X = x i ) = p i ,分布函数有 P(0)=0,P(n)=∑pi P ( 0 ) = 0 , P ( n ) = ∑ p i ,设随机变量U~U(0,1)的均匀分布,则 p(P(n−1)x∗x∗,如果 u>P(x∗) u > P ( x ∗ ) 舍弃该值;返回上一步,否则接受。几何解释如下: 这里写图片描述 常数c的选取:c应该尽可能地小,因为抽样效率与c成反比;一般取 c=maxP(x)/Q(x),xϵ[a,b] c = m a x P ( x ) / Q ( x ) , x ϵ [ a , b ] 。这里的 Q(x) Q ( x ) 可以取均匀分布,这样由第二种中两个均匀分布便能得到其他任意分布的模拟抽样。

5、正态随机数的生成

  除了上面的反函数法和舍选法,正态随机数还可以根据中心极限定理和Box Muller(坐标变换法)得到。 中心极限定理:如果随机变量序列 X1,X2,...,Xn,.. X 1 , X 2 , . . . , X n , . . 独立同分布,并且具有有限的数学期望和方差 E(Zi)=μ,D(Xi)=σ2(i=1,2,...) E ( Z i ) = μ , D ( X i ) = σ 2 ( i = 1 , 2 , . . . ) ,则对于一切x∈R有         clip_image002[80] 也就是说,当n个独立同分布的变量和,服从 N(nμ,nσ2) N ( n μ , n σ 2 ) 的正态分布(n足够大时)。 设n个独立同分布的随机变量 U1,U2,...,Un U 1 , U 2 , . . . , U n ,它们服从U(0,1)的均匀分布,那么 clip_image002[86] 渐近服从正态分布 N(0,1) N ( 0 , 1 ) 。 Box Muller方法,设(X,Y)是一对相互独立的服从正态分布 N(0,1) N ( 0 , 1 ) 的随机变量,则有概率密度函数:           clip_image002[90] 令 x=Rcosθ,y=Rsinθ x = R c o s θ , y = R s i n θ ,其中 x∈(0,2π) x ∈ ( 0 , 2 π ) ,则R有分布函数:        clip_image002[99] 令 FR(r)=1−e−r22 F R ( r ) = 1 − e − r 2 2 ,则分布函数的反函数得:        clip_image002[103] 如果 U1 U 1 服从均匀分布U(0,1),则R可由 −2lnU1−−−−−−√ − 2 l n U 1 模拟生成( (1−U1) ( 1 − U 1 ) 也为均匀分布,可被 U1 U 1 代替)。令 θ θ 为 2πU2 2 π U 2 , U2 U 2 服从均匀分布U(0,1)。得:    clip_image002[124]   X和Y均服从正态分布。用Box Muller方法来生成服从正态分布的随机数是十分快捷方便的。

下面介绍几种简单的随机数的算法

1、 生成随机数 一般c语言中提供了随机数生成函数, 其一是伪随机数–rand:用于返回一个0-32767之间的伪随机数; 其二是随机种子函数–srand:用来初始化随机数发生器的随机种子

#include #include #include int main() { int i,j; srand((int)time(0)); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { printf("%d ",rand()); } printf("\n"); } return 0; }

当然也可以生成一定范围内的随机数,比如生成0——100之间的随机数。

#include #include #include int main() { int i,j; srand((int)time(0)); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { printf("%d ",rand()*100/32767); } printf("\n"); } return 0; }

也可以生成100——200之间的随机数

#include #include #include int main() { int i,j; srand((int)time(0)); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { printf("%d ",rand()/1000+100); } printf("\n"); } return 0; }

使用rand()函数获取一定范围内的一个随机数,如果想要获取在一定范围内的数的话,直接做相应的除法取余即可。

#include #include using namespace std; int main() { srand(time(0)); for(int i=0;i 0 bool OneIn(int n) { return (Next() % n) == 0; } // Skewed: pick "base" uniformly from range [0,max_log] and then // return "base" random bits. The effect is to pick a number in the // range [0,2^max_log-1] with exponential bias towards smaller numbers. uint32_t Skewed(int max_log) { return Uniform(1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3