五种常⽤的随机数发⽣器-matlab实现
五种常⽤的随机数发⽣器-matlab实现
五种常⽤的随机数发⽣器包括平⽅取中发⽣器、乘积取中发⽣器、线性同余发⽣器、常数乘⼦发⽣器和斐波那契发⽣器。原理可问度娘,这⾥不再介绍,只总结代码实现。
1. 平⽅取中发⽣器
clc
clear all
close all
% 调⽤函数---参数可修改matlab生成随机数
[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
2. 乘积取中发⽣器
[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、常数乘⼦发⽣器
[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简单实现的五种随机数发⽣器,接下来有时间会补充组合发⽣器以及所⽣成的随机数序列的性能检验。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论