正文
c语言中正态函数 c语言正态分布函数
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
如何用c语言产生一定范围内的随机数?
利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。
在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
下面是0~32767之间的随机数程序:
#include stdlib.h
#include stdio.h
#include time.h // 使用当前时钟做种子
void main(void)
{int i;
srand((unsigned)time( NULL ) ); // 初始化随机数
for(i = 0; i 10;i++) // 打印出 10 个随机数
printf("%d\n", rand() );
}
根据上面的程序可以很容易得到0~1之间的随机数:
#include stdlib.h
#include stdio.h
#include time.h
int main( )
{int i;
srand((unsigned)time( NULL ) );
for(i = 0; i 10;i++)
printf("%5.2f\n", rand()/32767.0);
}
而产生1~100之间的随机数可以这样写:
#include stdlib.h
#include stdio.h
#include time.h
int main( )
{int i;
srand((unsigned)time( NULL ) );
for(i = 0; i 10;i++)
printf("%d\n", rand()%100+1);
}
扩展资料:
C语言高效编程技巧:
一:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题
二:数学方法解决问题
数学是计算机之母,没有数学的依据和基础,就没有计算机发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
三:使用位操作
实现高效的C语言编写的第三招----使用位操作,减少除法和取模的运算。
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效提高程序运行的效率。
参考资料来源:百度百科-C语言
C语言中如何定义一个从1~7的随机数。
在C语言中怎么产生随机数呢?
rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数。这是根据一个数,我们可以称它为 种 了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数。当计算机正常开机后,这个种子的值是定了的(也就是说你将产生的随机数已经定了,每次运行都产生的是相同的随机数),除非你破坏了系统。
为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a)。
初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随机序列,那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的.
下面讲一讲在C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
以下是一个产生随机数的例子:
需要首先使用随机数“种子”初始化,srand函数:
#i nclude stdlib.h
#i nclude stdio.h
#i nclude time.h//使用当前时钟做种子
void main( void )
{
int i;
srand( (unsigned)time( NULL ) );//初始化随机数
/* 打印10个随机数. */
for( i = 0; i 10;i++ )
printf( " %d\n", rand() );
}
在C语言中,是如何取得这个随机数的?
一个语句:rand();
它的作用就是随机取0到RAND_MAX之间的任何数。ANSI标准指出,RAND_MAX值的范围到少是32767,也就是双字节整数的最大值。 下面我们用一个例子来取得从1到6的随机整数:
#include stdio.h
#include stdlib.h
main()
{
int i;
for(i=1;i=20;i++)
printf("%10d",1+(rand()%6));
}
第2行的stdlib.h是rand()函数的头文件。第7行就是 实现功能的语句了。前面我们以经说过函数取的值是介于0到RANDMAX之间的,而我们所要的是1到6之间的整数。用脚想一想就知道:任一整数除以6所得的余数是0~5之间的整数,再加一之后就是1到6了,也就是我们的目标。利用这个原理我们使用%号对随机数进行了缩放。
OK,运行两次程序:
一:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
二:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
发现:两次运行的结果完全一样。
结论:这算什么随机数。
这种重复性是rand的一个重要特点,在调试程序时,这种重复性是必不可少的,因为它可以证明对程序的修改能够正常运行。
实际上,rand函数产生的是伪随机数。但我们需要的是随机数。于是,我们需要对程序进行随机化,这需要使用标准库函数srand来实现。函数srand需要一个无符号的整型参数,在每次程序执行时用函数rand去生在一组不同的随机数。
所以另一个语句是:srand()再rand()
#include stdlib.h
#include stdio.h
main()
{
int i;
unsignde seed;
printf("Enter a seed:");
scanf("%u",seed);
srand(seed);
for( i = 1;i=20;i++)
printf(""%10d",1+(rand()%6));
}
程序的运行结果是当我们输入不同的SEED时,产生不同组的随机数。这句话的意思有两个:一:当输入相同的SEED时,产生的同组随机数;二:每次运行我们都要输入一个SEED。
如果我们希望不用每次输入SEED值,而且每次运行时SEED值都是不同的,我们可以用下面语句代替上面的第三块的三个语句:
srand(time(NULL));
这会使计算机自动读取自己的时钟以获得SEED值。于是我们就获值了每次运行都会改变的SEED,同样也就获得了真正的随机数
//记:rand()产生一个0~RAND_MAX之间的数(如0~32767,我试了几次RAND_MAX最大只能为32767);
//rand()%n (n=32767) 就产生了一个0~n的数
//m+rand()%n(n=32767)就产生的是一个m~m+n的数。
//如果要产生4字节的int随机数,那要另寻方法:
//在网上找到一个:
// int N=0x7fffffff;
// cout(int)((double)rand() / (double)(RAND_MAX + 1) * N)"\n";
//但测试以后得 (0~0x7ffeffff)
//还有寻找中。。。
编写一个c语言程序,能够产生100个在0-1区间内服从正态分布的随机数
既然产生的不是伪随机数c语言中正态函数,那么随机源就是问题的关键。
随机源可以通过侦听和统计系统中的各种事件来模拟实现;这是一个很难的问题。
通过C调用Matlab的功能就简单多c语言中正态函数了。
如何用C语言得到服从平均分布的多个随机数?
把时间作为随机种子,基本可以认为是平均而且无规律的随机。
srand((unsigned)
time(NULL));
rand()产生0-RAND_MAX之间的整数,RAND_MAX是个常数,忘了,好像是7FFF,可以printf试一下。
random(N)产生0-N之间的整数
以上需要strlib.h
time.h
stdio.h
C语言 输入相同的值,输出结果不同,代码有错误吗?正态分布求概率问题
你输入的值是多少,造成了结果不同?
这段代码对
数值计算
的精度要求较高,即便采用了double数据类型,而double的有效位数为15位
十进制
,如果输入的参数的精度在运算后造成了
浮点数
截断误差,结果有可能会差那么一点点
正态分布形成的原理
首先,基本上每个人的学习都是相互独立的,所以可认为n个人的成绩是n个相互独立的随机变量X1,X2.....Xn,同时他们具有自己的数学期望和方差(每个人参加多次考试的成绩都会有所波动嘛),所以满足中心极限定理二李雅谱诺夫定理的条件,故无论各个随机变量服从什么分布,在满足上述定理的条件下,当人数较多时,即n较大时,ΣX就近似的服从正态分布。所以无论每个人的学习情况怎么样,总体是近似正太分布的。
正态分布在数理统计中具有基础性的作用,因此产生高质量的正态分布有重要的意义。我们将介绍几种数值方法求正态分布:中心极限定理,Hasiting 有理逼近法,统计工具箱,反函数法,舍选法,R软件及一维正态随机数的检验。
正态分布;一维;随机数。
一.利用中心极限定理
中心极限定理:(一般 n≥10),
产生服从N(μ,σ)的算法步骤:
(1)产生n 个RND 随机数:r1,r2,…,rn;
计算x?(?ri?(2) 2)/
i?1n122;
2(3) 计算 y=σx+μ ,y 是服从 N(μ,σ) 分布的随机数。
原理分析:
设ζ1,ζ2,…,ζn是n个相互独立的随机变量,且ζi~U(0,1), i= 1,2, …,n, 有E(?i)?1
,D(?i)?1,12
n??(??i?n由中心极限定理知 :)/,渐近服从正态分布N(0, l )。
i?1n
注意:我们现在已经能产生[0,1]均匀分布的随机数了,那么我们可以利用这个定理来产生标准正态分布的随机数。
r 1,r2,?,rn现在我们产生n个[0,1]均匀分布随机数,
我们有: ?1n1?u?n?r??n?i2???i?1?
为方便起见,我们特别选 n = 12,则 : u??ri?6
i?112
这样我们很方便地就把标准正态分布随机数计算出来了。
在C语言中表示为:
例1:利用中心极限定理产生标准正态分布随机数并检验
% example 1
clc,clear
for i=1:1000
R=rand(1,12);
X(i)=sum(R)-6;
end
X=X';
m=mean(X)
v=var(X)
subplot(1,2,1),cdfplot(X)
subplot(1,2,2),histfit(X)
h=kstest(X, [X normcdf(X, 0,1)])
结果为:H=0, 接受原假设,变换后的确为标准正态分布。
二.Hasiting 有理逼近法
这是一种计算速度快,也能满足一定精度的算法。我们可以构造分布函数反函数的近似逼近公式,来产生标准正态分布的随机数。其计算公式为:
2a?ay?ay012 x?y?1?b1y?b2y2?b3y3
y?(?2lnr)1/2,r~U(0,1),系数为: 这里
a0 = 2.515517 b1 = 1.432788
a1 = 0.802853 b2 = 0.189269
a2 = 0.010328 b3 = 0.001308
三.利用统计工具箱
在MATLAB统计工具箱中为我们提供了大量的产生各种随机数发生器程序,我们只需要调用就可以产生我们想要的随机数。
四.反函数法
设连续型随机变量Y的概率函数为 f(x), 需产生给定分布的随机数.
算法:
(1)产生n个RND 随机数r1,r2,…,rn;
从等式ri??f(y)dy中解出yi;所得(2) ??yiyi, i=1,2, …,n 即所求.
基本原理:
设随机变量Y的分布函数F(y)是连续函数,而且随机变量X~U(0,1),令Z=F(X)。 则Z与Y有相同分布。
证明 :FZ(z)= P{F(X) ≤ z}= P{X≤F(z)}=G(F(z)) = F(z)
因G(x)是随机变量X 的分布函数:
?0,?G(x)??x,
?1, ?-1-1 x?0;0?x?1;1?x.
-1Y若Y的概率密度为 f(y),由Y=F(X)可得: X?F(Y)??f(y)dy??
对给出定的(0, 1)上均匀分布随机数ri,则具有给定分布的随机数 yi 可由方程
if(y)dy解出。 ri????y
五.舍选法
基本思想:
实质上是从许多RND随机数中选出一部分, 使之成为具有给定分布的随机数。 设随机变量X的概率密度函数为f(x),存在实数ab,使P{aXb}=1。 算法步骤:
(1) 选取常数λ,使λf(x)<1,x∈(a, b);
(2) 产生两个RND 随机数r1 、r2,令y= a+(b-a)r1 ;
(3) 若r2≤λf(y),则令x=y;否则剔除 r1和r2, 重返步骤(2),重复循环, 产生的随机数x1,x2,…,xN的分布由概率函数 f(x) 确定。
舍选法算法原理分析:
设P{a<Z<b}=1,Z的概率密度为f(z),
(1)选常数λ,使λf(z)≤1,z∈(a,b);
(2)随机变量X1,X2相互独立Xi~U(0, 1),令Y1=a+(b-a)X1~U(a, b);
(3)若X2≤λf(Y1),则令X = Y1,否则剔除X1,X2重复到(2); 则随机变量X的分布与Z相同。
b注: 若不满足条件:?f(x)dx?1,a
可选取有限区间(a1, b1),使得 ?a1f(x)dx?1??(ε是很小的正数) 例如,取 a1=μ-3σ,b1=μ+3σ(x??)2?e2dx?1?0.003,有a12??b1?b1
在区间(a1, b1)上应用舍选法,不会出现较大的系统误差。
六.R软件
利用R软件,可方便地求各种常见概率分布的分布函数,分位点及生成各种常见分布的随机数等。在各种分布名称中加上不同的前缀表示不同的意义如:p-求分布函数,q-求分位点,r产生随机数等。
七、一维正态随机数的检验
我们已经基本搞清伪随机数的产生原理,由于并不是真正的随机数,很自然的问题是,它们是否具有真正随机数的那些统计性质如参数大小、独立性,均匀性等等。
设:随机数具有连续的分布函数F(X),则随机变量R=(X)是均匀分布(0,1)的随机变量,因此如果R通过统计检验随机变量 X 也可以通过。因此我们以下着重讨论均匀分布R的检验问题,再简单地讨论正态随机数检验问题。 统计推断原理:
X1,X2,?,Xn为 随机变量序列,则随机序列的函数称为统计量。统计量的定义:设
记为:
S?S(X1,X2,?,Xn)显然统计量 S 也是随机变量。既然是随机变量,它们就应该有其分布或称总体的规律,当然也有各种数字特征。例如均值、标准差、方差等等各阶矩。
我们的统计推断方式是:
(1)H0:某假定成立;
(2)在假定成立的条件下构造统计量S;
(3)统计量构造完毕,我们也就知道了该统计量的全部统计规律。如它的分布函数,或密度函数各阶矩等;
(4)根据统计量的分布,在给定的显著性水平α,对统计量S 的一次抽样确定以 1-α为概率的区域,该区域称为接受域 。如果该次抽样计算出统计量 S 的值 s 落入该领域,我们就接受原假,否则推翻原假设。这个就是小概率事件在一次实验实际不可能发生原理。落入由α 确定的区域是一个小概率事件,在一次实验中我们认为是不可能发生的。
统计检验中两类常用统计量的构造检验方法:
?,和有限方差D(X)= ?2,我们抽 N 1.设随机变量 X 具有数学期望E(X)=
?XN
i??
关于c语言中正态函数和c语言正态分布函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。