五种常用的随机数发生器-matlab实现
五种常用的随机数发生器包括平方取中发生器、乘积取中发生器、线性同余发生器、常数乘子发生器和斐波那契发生器。原理可问度娘,这里不再介绍,只总结代码实现。
- 平方取中发生器
clc
clear all
close all
% 调用函数---参数可修改
[x0,u0] = Square_mid_rand(156, 2, 20);
% 定义函数
function [x u] = Square_mid_rand(x0, k, maxIter)
x = []; % 初始化空矩阵
u = [];
x(1) = x0; % 赋值操作,即: x0 放到向量x的第一个分量中
u(1) = x(1) / 10^(2*k);
for i = 2 : maxIter % 循环
x(i) = rem(floor(x(i-1)^2 / 10^k), 10^(2*k)); % 随机数迭代发生器
u(i) = x(i) / 10^(2*k);
end
% 绘制图像
subplot(1,2,1);
hold on; % 保持当前状态。
plot(u(3:end), '*-'); % 数据为u的第3个分量开始到最后一个分量,*标记关键点
sTitle = sprintf('平方取中随机数发生器 (x0=%d, k=%d)', x0, k); % 格式化输出字符串
title(sTitle);
hold off;
subplot(1,2,2);
hold on;
hist(u(3:end));
title('随机数直方图分布');
hold off;
end
- 乘积取中发生器
clc
clear all
close all
% 调用函数---参数可修改
[x0, u0] = multiply_mid_rand(5167, 3729, 2, 20)
% 定义函数
function [x u] = multiply_mid_rand(x0, x1, k, maxIter)
x = [];
u = [];
x(1) = x0; x(2) = x1;
u(1) = x(1) / 10^(2*k);
for i = 3 : maxIter
x(i) = rem(floor(x(i-1) * x(i-2) / 10^k), 10^(2*k));
u(i) = x(i) / 10^(2*k);
end
hold on;
subplot(1,2,1);
plot(u(3:end), '*-');
sTitle = sprintf('乘积取中随机数发生器 (x0=%d, x1=%d, k=%d)', x0, x1, k);
title(sTitle);
subplot(1,2,2);
hist(u(3:end));
title('随机数直方图分布');
hold off;
end
3、线性同余发生器
clc
clear all
close all
% 调用函数---参数可修改
[x0,u0] = linear_mod_random(5, 5, 9, 5, 20)
% 定义函数
function [x,u] = linear_mod_random(a, c, m, x0, iterMax)
x = [];
u = [];
x(1) = x0;
u(1) = x(1) / m;
for i = 2 : iterMax
x(i) = a * x(i-1) + c;
x(i) = mod(x(i), m);
u(i) = x(i) / m;
end
hold on;
subplot(1,2,1);
plot(x(2:end), '*-');
sTitle = sprintf('线性同余随机数发生器 (a=%d, c=%d, m=%d, x0=%d)', a, c, m, x0);
title(sTitle);
subplot(1,2,2);
hist(u(2:end));
title('随机数直方图分布');
hold off;
end
4、常数乘子发生器
clc
clear all
close all
% 调用函数---参数可修改
[x0,u0] = con_mid_rand(6983, 2687, 2, 20);
% 定义函数
function [x u] = con_mid_rand(x0, M, k, maxIter)
x = [];
u = [];
x(1) = x0;
u(1) = x(1) / 10^(2*k);
for i = 2 : maxIter
x(i) = rem(floor(x(i-1) * M / 10^k), 10^(2*k));
u(i) = x(i) / 10^(2*k);
end
hold on;
subplot(1,2,1);
plot(u(2:end), 'r*-');
Title = sprintf('常数乘子随机数发生器 (x0=%d, M=%d, k=%d)', x0, M, k);
title(Title);
subplot(1,2,2);
hist(u(2:end));
title('随机数直方图分布');
hold off;
end
5、斐波那契发生器
clc
clear all
close all
% 调用函数---参数可修改
[x0,u0] = fib_rand(9, 20);
% 定义函数
function [x u] = fib_rand(m, MaxIter)
x = []; modX = [];
u = [];
x(1) = 1; x(2) = 1;
for i = 3 : MaxIter
x(i) = x(i-1) + x(i-2);
modX(i) = rem(x(i), m);
u(i) = modX(i) / m;
end
hold on;
subplot(1,2,1);
plot(modX(3:end), 'r*-');
sTitle = sprintf('斐波那契随机数发生器 (m=%d)',m);
title(sTitle);
subplot(1,2,2);
hist(u(3:end));
title('随机数直方图分布');
hold off;
end
以上用matlab简单实现的五种随机数发生器,接下来有时间会补充组合发生器以及所生成的随机数序列的性能检验。