随机性测试软件,5种随机性检测方法
时间: 2023-11-16 19:40:09 浏览: 32
随机性测试软件主要用于测试随机数生成器的质量和效果,以下是常见的五种随机性检测方法:
1. 熵测试:熵测试是通过检测随机数序列的熵值来评估其随机性。熵值越高,随机性越好。
2. 均匀分布测试:该测试检测生成的随机数是否在一个给定的范围内均匀分布。
3. 循环节测试:该测试检测生成的随机数序列是否存在循环节。
4. 自相关测试:该测试检测生成的随机数序列是否存在自相关性,即序列中的随机数之间是否存在某种模式。
5. 块测试:该测试将生成的随机数序列分成多个块,检测每个块中的随机数是否满足一定的统计学特征,如均值、方差等。
常见的随机性测试软件包括 NIST Statistical Test Suite、Dieharder、TestU01等。
相关问题
随机性检测的五项基本检测方法的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
```
这些程序可以用于对伪随机数序列进行基本的随机性检测,以评估伪随机数生成器的随机性。请注意,不同的检测方法适用于不同的随机性问题,因此需要根据具体情况选择适当的检测方法。