matlab 数列生成取值为1,-1的随机数列,验证其随机性

RANUNI:随机均匀分布数据的生成器及均匀性随机性检验
运用SAS进行Monte Carlo蒙特卡罗模拟(第三弹):
RANUNI:随机均匀分布数据的生成器及其均匀性和随机性检验
本文未经作者同意严禁转载
1 RANUNI:随机均匀分布数据的生成器
蒙特卡罗模拟的核心是随机数据的生成器,而各种随机数据的生成器的核心是随机均匀分布数据的生成器,因为各种特定分布的随机数据都可以通过随机均匀分布数据得到。产生随机数,可以通过物理方法取得,但当今最为普遍的乃是在计算机上利用数学方法产生随机数。这种随机数根据特定的迭代公式计算出来,初值确定后,序列就可以预测出来,所以不能算是真正的随机数(就成为“伪随机数”)。
RANUNI生成的随机均匀分布数据有着广泛的应用,它主要是通过以下递归公式来产生随机数据,R(i+1)=(a*R(i)+c) (mod
m)& i=0,1,2…,这里R(i)为第i个随机数,a为乘子,c为增量,(mod
m)是指将(a*R(i)+c)得到的数据取模运算,使得得到的数据都在(0,m)这个区间内。这个公式用SAS语句表示为:R=MOD(A*R+C,M);
要产生的随机数序列R(i)从第一个随机数R(0)开始和决定,然后得到在(0,m)这个区间的均匀分布的随机数,SAS会通过除以m得到(0,1)区间的随机数。在SAS系统中,常数a=397,204,094,m
2^31-1=2,147,483,647(是一个素数),c=0,种子R(0)必须是一个整数并且其值介于1到m-1之间。这里c=0的数据生成器被称为multiplicative
congruential generator,被广泛地应用。
我们可以通过下面这段程序测试一下SAS系统中,常数m的值:
DATA _NULL_;
R0=RANUNI(123);&&
***产生一个seed;
DO I=2 TO 2**31-1;
***除了这个Seed外,查看在接下来的第2个到2**31-1(即m)个R(i)中,能否得到与R0相同的值;
IF RANUNI(123)=R0
***如果得到与R0相同的值,则输出这个值的序号i,否则输出2**31-1的值,即表明2**31-2个数据里面没有与Seed相同的值;
THEN DO; PUT 'End of period at element #'
对于产生的伪随机数列我们必须通过一系列统计检验,然后可以把它们当成“真”随机数来使用。常用的统计检验方法有Chi-Square,KS值等等。RANUNI必须满足两个要求:均匀性和随机性。
2 均匀性检验:EQUIDST宏
均匀性是指随机数据均匀地分布在每个单位区间里,我们可以方便地用频数等方法来检验随机数据的均匀性。下面我们介绍一个宏EQUIDST,其目的就是用来测试产生的随机数据的均匀性。其原理是:将(0,1)这个区间分别划分成等距的2,3,…,n个子区间,然后标记这些子区间的频数,并进行适合度检测,即如果随机数均匀分布到(0,1)区间的话,每个子区间都应该有着相同的随机数个数,这样,我们就可以通过计算chi-square的值来判别随机数是否符合均匀分布。
SAS宏的运行参数如下:%EQUIDST(NRANNUM=1000000,HNSINT=100,SEED=123);这里,NRANNUM是要产生的随机数的个数,即1000000个,HNSINT是将(0,1)区间划分成多少个子区间,这里HNSINT=100,即划分成100个子区间,SEED=123即为种子。
EQUIDST宏程序如下:
EQUIDST(NRANNUM=,HNSINT=,SEED=0);
& DATA WORK(KEEP=SINTERV X);
LENGTH SINTERV X 3;
DO I=1 TO &NRANNUM;
***生成NRANNUM(本例是1000000)个随机数;
R=RANUNI(&SEED);&
***用RANUNI函数生成均匀分布的随机数;
DO SINTERV=2 TO &HNSINT;
&&&&&&&&&&&&&
X=1+INT(SINTERV*R); ***将得到的随机数分配到相应的子区间中;
&&&&&&&&&&&&&
PROC FREQ DATA=WORK; ***查看各子区间随机数频数分布情况;
TABLE SINTERV*X/LIST OUT=WORK(KEEP=SINTERV COUNT)
& DATA WORK(KEEP=PVALUE);
BY SINTERV;
RETAIN EXPFREQ CHISQ;
IF FIRST.SINTERV THEN DO; ***开始计算一个子区间的chi-square;
EXPFREQ=&NRANNUM/SINTERV;
CHISQ=0; ***子区间的chi-square赋初值为零;
CHISQ=CHISQ+(COUNT-EXPFREQ)**2/EXPFREQ; ***累加chi-square;
IF LAST.SINTERV THEN DO; ***结束计算这子区间的chi-square;
PVALUE=1-PROBCHI(CHISQ,SINTERV-1);
***计算该子区间的P值;
OUTPUT; ***将该子区间的P值输出出到work数据集中;
& PROC FORMAT;
***设置所有子区间的P值分布情况;
VALUE SIGNIF
0.0000-0.0001='P&0.0001'
&&&&&&&&&&&&&&&&&
0.0001-0.001 ='P&0.001'
&&&&&&&&&&&&&&&&&
0.001 -0.01&
&&&&&&&&&&&&&&&&&
0.01& -0.05&
&&&&&&&&&&&&&&&&&
0.05& -0.10&
&&&&&&&&&&&&&&&&&
0.10& -0.15&
&&&&&&&&&&&&&&&&&
='P&0.15';
& PROC FREQ
DATA=WORK;&&
***查看所有子区间的P值分布情况;
TABLE PVALUE;
FORMAT PVALUE SIGNIF.;
TITLE1 "Results of the Uniformity Test";
TITLE2 "------------------------------";
TITLE3 "# of Random Numbers: &NRANNUM";
TITLE4 "Subintervals Tested: 2 to &HNSINT";
*********************************************************;
%EQUIDST(NRANNUM=1000000,HNSINT=100,SEED=123);
从结果中我们可以看出,P值小于0.01的区间一个也没有,P值在0.01到0.05的区间有9个,而绝大多数的P值大于0.15,说明了RANUNI产生的随机数是均匀分布的。
3 随机性检验:CORRTEST
随机性检验是一个很宽泛的概念,包含了很多方面的特征,单个测试很难对随机性进行检验,因此,在进行随机性检验时,我们要尽可能多地检验随机性的各个方面。
在本例中,我们介绍SAS宏CORRTEST来对随机性的一个重要特征:相关性进行检验,即检验第i个随机数和第i+j个随机数之间的相关性。我们首先用函数生成随机数集,然后用CORRTEST计算其相关性:
DATA SAMPLE(KEEP=X);
DO I=1 TO 1000000;
X=RANUNI(123);
%CORRTEST(DATA=SAMPLE,HLAG=100,VAR=X);
这里HLAG是SAS函数lag标识,例如对于一个数列1,2,3,4,5,6,对于数据6,其lag(1)=5,lag(2)=4,依次类推,这里我们考察的是随机数与其前面的100个数据的相关性。
SAS宏CORRTEST程序如下:
%MACRO CORRTEST(DATA=,HLAG=,VAR=);
DATA WORK(KEEP=LAG0-LAG&HLAG);
SET &DATA NOBS=NOBS END=END;
ARRAY LAGARRAY(*) LAG0-LAG&HLAG;
***计录随机数i之前HLAG个随机数;
RETAIN LAG0-LAG&HLAG;
IF _N_&=&HLAG THEN
LAGARRAY(_N_+1)=&VAR;
***当_N_小于HLAG时,会有缺失值,故要单独处理,详见lag函数相关文档;
&&&&&&&&&&&&&&&&&&&&&&
ELSE DO; DO I=1 TO &HLAG;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
LAGARRAY(I)=LAGARRAY(I+1);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
LAGARRAY(&HLAG+1)=&VAR;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
IF END THEN DO; CALL SYMPUT('N',
&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMPRESS(PUT(NOBS,BEST10.)));
&&&&&&&&&&&&&&&&&&&&&&
DO J=0 TO &HLAG-2;
&&&&&&&&&&&&&&&&&&&&&&&&&
DO I=1 TO &HLAG-J;
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&LAGARRAY(I)=LAGARRAY(I+1);
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&
LAGARRAY(&HLAG-J+1)=.;
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
& PROC CORR DATA=WORK
OUTP=WORK(WHERE=(_TYPE_='CORR')) NOPRINT;
WITH LAG1-LAG&HLAG;
& DATA WORK(KEEP=PVALUE);
RETAIN N &N;
CORR=LAG0;
N=N-1;&&&&&&&&&&
***自由度;
IF ABS(CORR)=1 THEN PVALUE=0;
&&&&&&&&&&&&&&&&&&&&ELSE
PVALUE=2*(1-PROBT(ABS(CORR/
&&&&&&&&&&&&&&&&&&&&&&&&&&
SQRT(1-(CORR*CORR))*SQRT(N-2)),N-2));
& PROC FORMAT;
VALUE SIGNIF
0.0000-0.0001='P&0.0001'
&&&&&&&&&&&&&&&&&&&
0.0001-0.001 ='P&0.001'
&&&&&&&&&&&&&0.001
-0.01& ='P&0.01'
&&&&&&&&&&&&&&&&&&&
0.01& -0.05&
&&&&&&&&&&&&&&&&&&&
0.05& -0.10&
&&&&&&&&&&&&&&&&&&&
0.10& -0.15&
&&&&&&&&&&&&&&&&&&&
='P&0.15';
& PROC FREQ DATA=WORK;
TABLE PVALUE;
FORMAT PVALUE SIGNIF.;
TITLE1 "Results of the Correlation Test";
TITLE2 "-------------------------------";
TITLE3 "# of Random Numbers: &N";
TITLE4 "Lags Tested: 1 to &HORDER";
这里只有一个P值小于0.01,9个P值介于0.01到0.05之间,绝大多数的P值大于0.15,可以说明RANUNI产生的随机数自相关不显著。
当然,与上一篇文章一样,我们可以轻松地应用SAS的作图过程画出P值的分布情况,程序如下:
DATA SAMPLE(KEEP=X);
DO I=1 TO 500000;
X=RANNOR(123);
%CORRTEST(DATA=SAMPLE,HLAG=1000,VAR=X)
PROC CHART DATA=WORK;
VBAR PVALUE / LEVELS=10;
LABEL PVALUE="p-values of the Correlation
Xitao Fan, etc..Monte Carlo Studies: A Guide for Quantitative
Researchers. SAS Institute Inc.,2002
本文章只用于学习,请不要用于商业目的,否则后果自负。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。GM(1,1)模型及其Matlab实现_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
3页¥2.008页1下载券3页1下载券7页¥3.002页免费 59页2下载券5页免费3页免费3页1下载券4页免费
喜欢此文档的还喜欢19页免费24页免费2页免费285页免费663页免费
GM(1,1)模型及其Matlab实现|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢用MATLAB编程;1菲波拉契数列:2求1000以内的质数;3随机点名器_百度知道
用MATLAB编程;1菲波拉契数列:2求1000以内的质数;3随机点名器
1、产生斐波那楔数列%% 产生斐波那楔数列n=input('请输入数列个数:');Sn=ones(1,n);for i=1:n
Sn(i)=Sn(i-1)+Sn(i-2);
endenddisp('&&该斐波那楔数列如下:')Sn 2、质数求取%% 1000以内质数m=1000;b(1:m)=0;a(1:200)=0;for i=1:1000
b(i)=i;endfor i=1:1000
for j=2:floor(sqrt(i))
if rem(i,j)==0
endendB=find(b&0);disp('&&1000以内的质数如下:')B 3、你说的随机点名器说具体点!!
其他类似问题
质数的相关知识
按默认排序
其他1条回答
可以参考随机数生成规则和具体背景材料来设计
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Matlab中的随机函数Matlab
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Matlab中的随机函数
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 matlab 等差数列 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信