五种常用的随机数发生器-matlab实现

五种常用的随机数发生器-matlab实现

五种常用的随机数发生器包括平方取中发生器、乘积取中发生器、线性同余发生器、常数乘子发生器和斐波那契发生器。原理可问度娘,这里不再介绍,只总结代码实现。

  1. 平方取中发生器
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
  1. 乘积取中发生器
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简单实现的五种随机数发生器,接下来有时间会补充组合发生器以及所生成的随机数序列的性能检验。

上一篇:求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小。


下一篇:数值分析实验之线性方程组的迭代求解(MATLAB实现)