随机数的性能检验-matlab实现

常用的随机数性能检验方法有:参数检验、均匀性检验、独立性检验和组合规律检验,下面用matlab一一实现这些检验。(程序中调用的随机数序列生成函数square_mid_rand参考博文)

  1. 参数检验
    一般检验随机数序列的均值、方差、峰度和偏度,matlab实现如下:
% 随机数发生器生成随机数序列
[T,u1] = square_mid_rand(231, 2, 100);

% 函数调用
[t1,t2,t3,t4] = parameter_test(T);

% 参数检验
function [t1,t2,t3,t4] = parameter_test(R)
n = length(R);
R_mean = mean(R);
R_var = var(R);
R_std = std(R);

% 均值
u1 = sqrt(12*n)*(R_mean-0.5);
if abs(u1)<1.96
    t1 = 'pass'
else
    t1 = 'failed'
end

% 方差
u2 = sqrt(180*n)*(R_var-1/12);
if abs(u2)<1.96 
    t2='pass'
else
    t2='failed'
end

% 偏度
u3 = mean(((R-R_mean)/R_std).^3)*0.408248*sqrt(n);
if abs(u3)<1.96 
    t3='pass'
else
    t3='failed'
end

% 峰度
uu = mean(((R-0.5)/sqrt(1/12)).^4)-1.75;
u4 = uu*0.204124*sqrt(n);
if abs(u4)<1.96
    t4='pass'
else
    t4='failed'
end

end
  1. 均匀性检验
    常用的均匀性检验包括K-S检验和卡方检验,前者是基于后者的检验,matlab实现如下:
% 随机数发生器生成随机数序列
[T,u1] = square_mid_rand(231, 2, 100);

% 函数调用
ks_test = k_s_test(u1');
chi2_test = chi_2_test(u1);

% 均匀性的K-S检验
function [ks_test] = k_s_test(X)
h = kstest(X, [X unifcdf(X,0,1)]);
if h == 0
    ks_test = 'pass'
else
    ks_test = 'failed'
end
end

% 均匀性的chi-2检验
function [chi2_test] = chi_2_test(Y)
% 构造卡方统计量
k=10;   % 参数可变
n=length(Y);
n1=hist(Y,k);     % 计算每个区间的频数
kf_7 = k/n*(sum((n1-n/k).^2));   % 计算分位点即统计量
chi2_p=chi2cdf(k-1,kf_7);         % 计算下侧概率
if chi2_p < 0.95
    chi2_test='pass'
else
    chi2_test='failed'
end
end
  1. 独立性检验
    独立性检验一般包括列联表检验和自相关检验,matlab实现如下:
% 随机数发生器生成随机数序列
[T,u1] = square_mid_rand(231, 2, 100);

% 函数调用
[sacf1,sacf2,sacf3] = acf_1_test(u1);
chi2_str_test = chi_2_str_test(reshape(u1,[64,2]));

% 自相关AFC检验--
function [sacf1,sacf2,sacf3]=acf_1_test(R)
R_mean=mean(R);
R_var=var(R);
n=length(R);
for i=1:3      这里只检验了前三阶自相关,如有需要可自行调参
    rou(i)=sum(((R(1:n-i).*R(i+1:n)-R_mean^2))/R_var)*sqrt(1/(n-i));
end
if abs(rou(1))<1.96
    sacf1='pass'
else
    sacf1='failed'
end
if abs(rou(2))<1.96
    sacf2='pass'
else
    sacf2='failed'
end
if abs(rou(3))<1.96
    sacf3='pass'
else
    sacf3='failed'
end
end

% 列联表检验
function chi2_str_test = chi_2_str_test(Z)
N=100;
k=6;
n=hist3(Z,[k k]); % 产生每个小正方形落入的个数
ni=sum(n');
nj=sum(n);
nij=ni'*nj;
n_sum=sum(sum(n.^2./nij))-1;
chi2_2=N*n_sum;
chi2_p=chi2cdf((k-1)^2,chi2_2);
if chi2_p<0.95
    chi2_str_test = 'pass'
else
    chi2_str_test = 'failed'
end
end
  1. 组合规律检验
    一般用扑克牌检验,matlab实现如下:
% 随机数发生器生成随机数序列
[T,u1] = square_mid_rand(231, 2, 128);

% 函数调用
pk_test = p_k_test(u1);

% 扑克牌检验
function pk_test = p_k_test(W)
all_num = length(W);
per_num = 8;
iter = 1;
% 每8个随机数作为一组,求16组数据的颜色数,并放入矩阵per_color中,128/8=16
for iter_i = 1:per_num:all_num
    % 对每组数小数点后第一位取模为8运算
    rr = 10*W(iter_i:iter_i+7);
    pk = mod(fix(rr),8);     
    % 计算每组的颜色数
    pk = sort(pk);
    j = 1;
    for i = 1:7
        if pk(i) ~= pk(i+1)
            j = j+1;
        end
    end
    per_color(iter) = j+1;
    iter = iter+1; % 将颜色数输入到数组per_color中
end

% 构造自由度为4的卡方分布,并进行检验。
n_pk = per_color;
nn(1) = sum(n_pk(1:3));
nn(2:4) = n_pk(4:6);
nn(5) = sum(n_pk(7:8));
% 下面的[]内为题目所给各颜色的理论概率
m = [0.02 0.1703 0.4205 0.3195 0.0697] * all_num;  
chi_4 = sum((m-nn).^2./m); % 构造统计量
p = chi2cdf(4,chi_4);
if p < 0.95 
    pk_test = 'pass'
else
    pk_test = 'failed'
end
end
  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值