游程检验的随机性检测模型
时间: 2024-04-19 19:19:54 浏览: 15
游程检验是一种常用的随机性检测模型,用于评估一串二进制序列的随机性。它基于统计学原理,通过计算序列中连续出现相同数字的游程(run)的长度分布来判断序列的随机性。
在游程检验中,一个游程是指连续出现相同数字的序列片段。例如,在二进制序列"110100111001"中,有4个游程,分别是"11"、"0"、"111"和"00"。游程检验通过统计不同长度的游程出现的频率,然后与理论上的期望频率进行比较,来判断序列的随机性。
常见的游程检验模型包括:
1. 简单游程检验(Simple Runs Test):该模型统计序列中1和0的游程长度,并与理论上的期望频率进行比较。
2. 长度为3的游程检验(Runs of Three Test):该模型统计序列中长度为3的游程的频率,并与理论上的期望频率进行比较。
3. 长度为5的游程检验(Runs of Five Test):该模型统计序列中长度为5的游程的频率,并与理论上的期望频率进行比较。
4. 长度为6以上的游程检验:除了上述模型外,还可以进行更长游程的检验,如长度为6、7、8等的游程检验。
这些游程检验模型可以用于评估随机数生成器的质量,或者判断一串二进制序列是否具有随机性。它们在密码学、随机数生成、数据压缩等领域有广泛的应用。
相关问题
随机性检测的五项基本检测方法的matlab程序
以下是五项基本检测方法的 Matlab 程序:
1. 频数检测
```matlab
function [p_value] = frequency_test(bits)
n = length(bits);
count = sum(bits);
p_value = 2*min(count, n-count)/n;
end
```
2. 块频数检测
```matlab
function [p_value] = block_frequency_test(bits, block_size)
n = length(bits);
num_blocks = floor(n/block_size);
counts = zeros(num_blocks, 1);
for i = 1:num_blocks
block = bits((i-1)*block_size+1:i*block_size);
counts(i) = sum(block);
end
chi2 = ((counts - block_size/2).^2) / (block_size/2);
p_value = 1 - gammainc(num_blocks/2, chi2/2);
end
```
3. 游程总数检测
```matlab
function [p_value] = runs_test(bits)
n = length(bits);
runs = 1;
for i = 2:n
if bits(i) ~= bits(i-1)
runs = runs + 1;
end
end
pi = runs / n;
tau = 2 / sqrt(n);
if abs(pi - 0.5) >= tau
p_value = 0;
else
vobs = 1;
for i = 2:n
if bits(i) ~= bits(i-1)
vobs = vobs + 1;
else
break;
end
end
for i = n:-1:2
if bits(i) ~= bits(i-1)
vobs = vobs + 1;
else
break;
end
end
mu = (2*n - 1) / 3;
sigma2 = (16*n - 29) / 90;
sigma = sqrt(sigma2);
z = (vobs - mu) / sigma;
p_value = erfc(abs(z) / sqrt(2));
end
end
```
4. 乱数排列检测
```matlab
function [p_value] = permutation_test(bits)
n = length(bits);
pi = sum(bits) / n;
if abs(pi - 0.5) >= 2/sqrt(n)
p_value = 0;
else
k = 0;
for i = 2:n
if bits(i) ~= bits(i-1)
k = k + 1;
end
end
k = k + 1;
tau = 2 / sqrt(n);
if abs(k - 2*n*pi*(1-pi)) >= tau
p_value = 0;
else
p_value = gammainc((n-1)/2, (abs(k - 2*n*pi*(1-pi))/2)^2);
end
end
end
```
5. 矩阵秩检测
```matlab
function [p_value] = matrix_rank_test(bits, matrix_size)
n = length(bits);
num_matrices = floor(n/matrix_size);
counts = zeros(num_matrices, 1);
for i = 1:num_matrices
matrix = reshape(bits((i-1)*matrix_size+1:i*matrix_size), sqrt(matrix_size), sqrt(matrix_size));
counts(i) = rank(matrix);
end
mu = matrix_size*(1/2 + 1/18);
sigma2 = matrix_size*(13/18 - 7/180)^2 + matrix_size*(1/6 - 1/180);
sigma = sqrt(sigma2);
chi2 = ((counts - mu).^2) / sigma2;
p_value = 1 - gammainc(num_matrices/2, chi2/2);
end
```
伪随机数的随机性基本检测方法的matlab程序
以下是常用的伪随机数的随机性基本检测方法的 Matlab 程序:
1. 频数检测
```matlab
function [p_value] = frequency_test(numbers)
n = length(numbers);
count = sum(numbers);
p_value = 2*min(count, n-count)/n;
end
```
2. 块频数检测
```matlab
function [p_value] = block_frequency_test(numbers, block_size)
n = length(numbers);
num_blocks = floor(n/block_size);
counts = zeros(num_blocks, 1);
for i = 1:num_blocks
block = numbers((i-1)*block_size+1:i*block_size);
counts(i) = sum(block);
end
chi2 = ((counts - block_size/2).^2) / (block_size/2);
p_value = 1 - gammainc(num_blocks/2, chi2/2);
end
```
3. 游程总数检测
```matlab
function [p_value] = runs_test(numbers)
n = length(numbers);
runs = 1;
for i = 2:n
if numbers(i) ~= numbers(i-1)
runs = runs + 1;
end
end
pi = runs / n;
tau = 2 / sqrt(n);
if abs(pi - 0.5) >= tau
p_value = 0;
else
vobs = 1;
for i = 2:n
if numbers(i) ~= numbers(i-1)
vobs = vobs + 1;
else
break;
end
end
for i = n:-1:2
if numbers(i) ~= numbers(i-1)
vobs = vobs + 1;
else
break;
end
end
mu = (2*n - 1) / 3;
sigma2 = (16*n - 29) / 90;
sigma = sqrt(sigma2);
z = (vobs - mu) / sigma;
p_value = erfc(abs(z) / sqrt(2));
end
end
```
4. 累加和检测
```matlab
function [p_value] = cumulative_sums_test(numbers)
n = length(numbers);
s = cumsum(2*numbers-1);
a = max(abs(s));
p_value = erfc(a/sqrt(n)/sqrt(2));
end
```
5. 近似熵检测
```matlab
function [p_value] = approximate_entropy_test(numbers, m)
n = length(numbers);
c = zeros(n-m+1, 1);
for i = 1:n-m+1
block = numbers(i:i+m-1);
count = 0;
for j = 1:n-m+1
if i ~= j
if isequal(numbers(j:j+m-1), block)
count = count + 1;
end
end
end
c(i) = count / (n-m);
end
phi_m = mean(log(c));
c = zeros(n-m-1, 1);
for i = 1:n-m-1
block = numbers(i:i+m);
count = 0;
for j = 1:n-m-1
if i ~= j
if isequal(numbers(j:j+m), block)
count = count + 1;
end
end
end
c(i) = count / (n-m-1);
end
phi_m_plus_1 = mean(log(c));
p_value = gammainc((n-m)*phi_m - (n-m-1)*phi_m_plus_1, m/2);
end
```
这些程序可以用于对伪随机数序列进行基本的随机性检测,以评估伪随机数生成器的随机性。请注意,不同的检测方法适用于不同的随机性问题,因此需要根据具体情况选择适当的检测方法。