伪随机数的随机性基本检测方法的matlab程序
时间: 2023-12-07 19:09:08 浏览: 29
以下是常用的伪随机数的随机性基本检测方法的 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
```
这些程序可以用于对伪随机数序列进行基本的随机性检测,以评估伪随机数生成器的随机性。请注意,不同的检测方法适用于不同的随机性问题,因此需要根据具体情况选择适当的检测方法。