univerify.m

来自「该程序用来检验monte carlo随机数的分布是否满足随机性要求。包括独立性检」· M 代码 · 共 64 行

M
64
字号
function okay=uniVerify(varargin)
if nargin==1
    r=varargin{1,1};
    alpha=0.05;k=20;     %默认为0.05显著性检验,区间等分为20。
end
if nargin==2
    r=varargin{1,1};
    alpha=varargin{1,2};
    k=20;
end
if nargin==3
    r=varargin{1,1};
    alpha=varargin{1,2};
    k=varargin{1,3};
end

% %程序测试代码
% r=myunirnd(30,1);
% alpha=0.05;
% k=20;

r=reshape(r,1,[]);
critical.alpha=[0.05 0.01];
critical.pvalue=[16.919 21.666;30.144 36.191;42.557 49.588];    %规定k=10,20,30,所以自由度为9,19,29。
[row,col]=find(critical.alpha==alpha);
theory_critical=critical.pvalue(k/10,col);
n=prod(size(r));
theory_freq=n/k; %理论频数

%统计实际频数

%等分区间[0 1]为k个,divide_point为各等分点及两个端点。
for i=0:k
    divide_point(i+1)=i/k;
end

%对随机数的序列进行重新排序
r=sort(r);

%统计各区间的频数
i=1;
j=1;
real_freq=zeros(k,1);
while i<=n & j<k+1
    if r(i)<divide_point(j+1) & r(i)>=divide_point(j)
        real_freq(j)=real_freq(j)+1;
        i=i+1;
        continue
    else
        j=j+1;
    end
end

%统计实际chi-square值
real_chi_square=k/n*sum((real_freq-theory_freq).^2);

if real_chi_square>theory_critical
    okay=0;
    fprintf('不满足均匀性检验!\n')
else
    okay=1;
    fprintf('满足均匀性检验!\n')
end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?