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

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Matlab实现伪随机白噪声发生器,可以使用randn函数生成服从高斯分布的随机序列。这个函数可以生成均值为0,方差为1的高斯分布随机数。通过调整序列的长度和幅度,可以得到不同功率密度的白噪声信号。下面是一个示例代码: ```matlab % 设置参数 N = 10000; % 序列长度 A = 1; % 幅度 % 生成白噪声序列 y = A * randn(1, N); % 绘制信号图像 plot(y); title('伪随机白噪声信号'); xlabel('样本点'); ylabel('幅度');``` 这段代码会生成一个长度为N的白噪声序列,并绘制出信号图像。你可以根据需要调整N和A的值来得到不同长度和幅度的白噪声信号。请注意,randn函数生成的数值服从正态分布,即均值为0,方差为1,通过乘以幅度A可以调整信号的幅度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [均匀分布白噪声和高斯白噪声及其matlab产生方式](https://blog.csdn.net/keilzc/article/details/122846510)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [伪随机序列发生器仿真研究.doc](https://blog.csdn.net/weixin_35649143/article/details/117239715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值