检验序列随机性的matlab代码
时间: 2023-10-04 07:03:16 浏览: 176
以下是用 Matlab 检验序列随机性的示例代码:
```matlab
%% 生成随机序列
n = 1000; % 序列长度
seq = randi([0,1], 1, n); % 生成 0/1 随机序列
%% Runs Test
n1 = sum(seq); % 统计 1 的个数
n2 = n - n1; % 统计 0 的个数
runs = 1; % 当前 run 的个数
for i = 2:n
if seq(i) ~= seq(i-1) % 这个数与前一个数不同
runs = runs + 1; % 新增一个 run
end
end
exp_runs = 2 * n1 * n2 / n + 1; % 计算期望的 run 数量
std_runs = sqrt(2 * n1 * n2 * (2 * n1 * n2 - n) / n^2 / (n-1)); % 计算 run 数量的标准差
z_runs = (runs - exp_runs) / std_runs; % 计算 z 值
p_runs = 2 * (1 - normcdf(abs(z_runs))); % 计算 p 值
fprintf('Runs Test:\n');
fprintf(' runs = %d, exp_runs = %f, std_runs = %f, z_runs = %f, p_runs = %f\n', runs, exp_runs, std_runs, z_runs, p_runs);
%% Frequency Test
n0 = sum(seq == 0); % 统计 0 的个数
n1 = n - n0; % 统计 1 的个数
if n0 ~= n1 % 只有当序列中 0 和 1 的数量相等时才进行频率检验
fprintf('Frequency Test: skip (n0 ~= n1)\n');
else
n_freq = sum(abs(diff(seq)) == 1) + 1; % 统计 01 和 10 的个数
exp_freq = 2 * n0 * n1 / n; % 计算期望的 01/10 数量
std_freq = sqrt(exp_freq * (1 - exp_freq) * (2*n-1) / n^2); % 计算 01/10 数量的标准差
z_freq = (n_freq - exp_freq) / std_freq; % 计算 z 值
p_freq = 2 * (1 - normcdf(abs(z_freq))); % 计算 p 值
fprintf('Frequency Test:\n');
fprintf(' n_freq = %d, exp_freq = %f, std_freq = %f, z_freq = %f, p_freq = %f\n', n_freq, exp_freq, std_freq, z_freq, p_freq);
end
```
这段代码包含了 Runs Test 和 Frequency Test 两种检验方法。Runs Test 检验序列中的 runs 是否符合随机分布的期望,Frequency Test 检验序列中 01 和 10 的数量是否符合随机分布的期望。注意,这里的随机序列是指二元随机序列,即只包含 0 和 1 两种元素的序列。如果你需要检验其他类型的随机序列,可以参考其他的随机性检验方法。
阅读全文