常用的随机数性能检验方法有:参数检验、均匀性检验、独立性检验和组合规律检验,下面用matlab一一实现这些检验。(程序中调用的随机数序列生成函数square_mid_rand参考
博文
)
-
参数检验
一般检验随机数序列的均值、方差、峰度和偏度,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'
t1 = 'failed'
u2 = sqrt(180*n)*(R_var-1/12);
if abs(u2)<1.96
t2='pass'
t2='failed'
u3 = mean(((R-R_mean)/R_std).^3)*0.408248*sqrt(n);
if abs(u3)<1.96
t3='pass'
t3='failed'
uu = mean(((R-0.5)/sqrt(1/12)).^4)-1.75;
u4 = uu*0.204124*sqrt(n);
if abs(u4)<1.96
t4='pass'
t4='failed'
- 均匀性检验
常用的均匀性检验包括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'
ks_test = 'failed'
% 均匀性的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'
chi2_test='failed'
- 独立性检验
独立性检验一般包括列联表检验和自相关检验,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));
if abs(rou(1))<1.96
sacf1='pass'
sacf1='failed'
if abs(rou(2))<1.96
sacf2='pass'
sacf2='failed'
if abs(rou(3))<1.96
sacf3='pass'
sacf3='failed'
% 列联表检验
function chi2_str_test = chi_2_str_test(Z)
N=100;
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'
chi2_str_test = 'failed'
- 组合规律检验
一般用扑克牌检验,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;
per_color(iter) = j+1;
iter = iter+1; % 将颜色数输入到数组per_color中
% 构造自由度为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'
pk_test = 'failed'
常用的随机数性能检验方法有:参数检验、均匀性检验、独立性检验和组合规律检验,下面用matlab一一实现这些检验。(程序中调用的随机数序列生成函数square_mid_rand参考博文)本博文实现参数检验和均匀性检验,后两种方法的实现见博文。参数检验一般检验随机数序列的均值、方差、峰度和偏度,matlab实现如下:% 随机数发生器生成随机数序列[T,u1] = square_mid_rand(231, 2, 100);% 函数调用[t1,t2,t3,t4] = parameter_test
单个的随机数发生器在周期性等方面存在缺陷,组合发生器是将两个或者多个独立的随机数发生器以某种方式组合起来,使得新组合的随机数发生器具有更长的周期和良好的统计性质。
在组合发生器中比较著名的是M.D.Maclaren和G.Marsaglia于1965年提出的组合同余法,生成规则如下:
采用第一个线性同余发生器M1生成k个随机数,把k个数按序依次存放在某一个向量T中,T=(t1,t2,…,tk),令n=1;
用第二个线性同余发生器M2生成一个随机整数j,满足1 <= j <= k;
令xn = t
对均匀随机数进行性能检验的一种方法是使用MATLAB软件编制Kolmogorov-Smirnov (K-S)检验。以下是这种方法的步骤:
首先,生成一组均匀随机数序列。可以使用MATLAB中的rand函数来生成0到1之间的均匀随机数。通过指定随机数的数量和维度,可以得到所需数量的均匀随机数。
接下来,使用ksstat函数计算K-S统计量。将均匀随机数序列作为输入,该函数将计算该序列与理论均匀分布之间的最大差异。统计量的值越大,表示均匀分布与数据之间的差异越大。
然后,使用kstest函数进行假设检验。这个函数将基于K-S统计量的值和数据的大小来计算检验的p-value。如果p-value小于显著性水平(通常为0.05),则可以拒绝原假设,即假设数据来自均匀分布。
最后,根据p-value的结果和检验的有效样本大小(通常为30以上),判断均匀随机数是否通过了性能检验。如果p-value大于显著性水平,且样本大小足够大,则可以认为在给定的显著性水平下,该组均匀随机数通过了性能检验,可以用于进一步的分析。
需要注意的是,对于使用MATLAB进行其他类型的性能检验,可能会使用不同的函数和方法。这只是其中一种常见的方法之一。在实际应用中,还应该考虑其他因素,如均匀随机数生成算法的质量和随机数序列的长度等。
最后拉个票,本人正参与博客之星评选,1月24日前每天都可投票,敬请支持!谢谢!
投票链接:[code=python]
https://bss.csdn.net/m/topic/blog_star2020/detail?username=laoyuanpython
[/code]
或到老猿博文首页内的置顶博文跳转!
Python爬虫之urllib库
普通网友: