随机数的性能检验-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
2. 均匀性检验
常⽤的均匀性检验包括K-S检验和卡⽅检验,前者是基于后者的检验,matlab实现如下:
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
matlab生成随机数
chi2_test='pass'
else
chi2_test='failed'
end
end
3. 独⽴性检验
独⽴性检验⼀般包括列联表检验和⾃相关检验,matlab实现如下:
[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
4. 组合规律检验
⼀般⽤扑克牌检验,matlab实现如下:
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。