随机数的性能检验-matlab实现
2020-07-16 05:52
585 查看
常用的随机数性能检验方法有:参数检验、均匀性检验、独立性检验和组合规律检验,下面用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' 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
- 均匀性检验
常用的均匀性检验包括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
- 独立性检验
独立性检验一般包括列联表检验和自相关检验,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
- 组合规律检验
一般用扑克牌检验,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
相关文章推荐
- 【小试牛刀】短信验证码(随机数)的生成实现
- 均值滤波、中值滤波的matlab实现
- 大数据Spark “蘑菇云”行动第72课: 基于Spark 2.0.1项目实现之二. 实战 各种小bug修复及性能调优 200并行度调整为2个task
- A*算法的matlab实现GUI界面演示
- 数据归一化matlab及python 实现
- 原生JS实现页面数字在一个随机数区域内跳动 -- 简书
- Matlab中的随机数
- php获取四位字母和数字的随机数的实现方法
- C++实现matlab中的interp1和interp2插值
- 模拟退火算法之旅行商(TSP)问题matlab实现
- 伽马滤波实现(Matlab源码)
- 模拟和数字低通滤波器的MATLAB实现
- 生成一个一维数组,有10个元素,都用随机数填充,用指针轮询的办法实现函数查找一个数是否存在。
- [转帖]性能测试基础知识-性能的规划与实现
- 使用 matlab 数字图像处理(三)—— 实现图像的旋转(不使用 imrotate)
- MATLAB中如何产生指定范围的随机数
- 隐马尔可夫模型(HMM)的MATLAB实现——Baum-Welch算法
- 【nginx网站性能优化篇(2)】反向代理实现Apache与Nginx的动静分离(LNMPA)
- Matlab实现图像插值和降低图像灰度级
- 性能提高 : 一张图片实现Loading