Matlab中rand函数的使用方法

MATLAB中rand,randi,randn函数,及rand('state',0)和rand('seed',0)产生随机种子详解

             在学习matlab中看到书上有许多关于生成随机数的应用,y书上一开始会写一个rand('state',0),注释是为了方便验证,一开始并不是很理解,最近搜索网上文章等深入理解了下关于MATLAB中生成随机数函数的相关应用。

二、问题探究

1:rand(....)

        它是生成(0,1)之间(开环,不包含0和1两个数)均匀分布的伪随机数,也就是无穷次试验其中产生的概率是一样。

R = rand                                     %返回一个在区间(0,1)内均匀分布的随机数

R = rand(N)                                %生成NxN的矩阵随机数,其中每个元素位于0~1之间

R = rand(M,N,P,......)                  %生成一个MxNxPx........的矩阵随机数

R = rand([M,N,P.....])                  %同上,中括号不是必须的,例如:rand([3,4])返回一个3x4的矩阵

R = rand(......,CLASSNAME)   %生成CLASSNAME类型的随机数,如‘double’  or  ‘single’类型

 示例:

(1):由随机数组成的矩阵


 
 
  1. >>R = rand( 5) %生成一个由介于 01 之间的均匀分布的随机数组成的 5× 5 矩阵。
  2. R =
  3. 0. 8147 0.0975 0. 1576 0. 1419 0. 6557
  4. 0. 9058 0. 2785 0. 9706 0. 4218 0. 0357
  5. 0. 1270 0. 5469 0. 9572 0. 9157 0. 8491
  6. 0. 9134 0. 9575 0. 4854 0. 7922 0. 9340
  7. 0. 6324 0. 9649 0. 8003 0. 9595 0. 6787
  8. >> R = rand( 5, 3, 'double') %生成double类型的 5x3均匀分布的 01间随机数
  9. R =
  10. 0. 7577 0. 7060 0. 8235
  11. 0. 7431 0. 0318 0. 6948
  12. 0. 3922 0. 2769 0. 3171
  13. 0. 6555 0. 0462 0. 9502
  14. 0. 1712 0.0971 0. 0344

(2):指定区域内的随机数

     一般来说,可以使用公式 r = a + (b-a).*rand(N,1) 生成区间 (a,b) 内的 N 个随机数。


 
 
  1. >> r = - 5 + ( 5+ 5)*rand( 10, 1) %生成一个由区间 (- 5, 5) 内均匀分布的数字组成的 10× 1 列向量。
  2. r =
  3. - 0. 6126
  4. - 1.1844
  5. 2.6552
  6. 2.9520
  7. - 3.1313
  8. - 0. 1024
  9. - 0. 5441
  10. 1.4631
  11. 2.0936
  12. 2.5469

(3):随机复数


 
 
  1. >> a = rand + 1i*rand %生成一个实部和虚部位于区间 ( 0, 1) 内的随机复数。
  2. a =
  3. 0.7513 + 0.2551i

2:randi(......)

 randi(N) 是生成(0,N]间均匀分布的伪随机数,并且数都是整数,所以每个数是位于1到N之间。它的表达形式有以下几种:

R = randi(iMax)            % 生成1:iMax之间的均匀分布随机数
R = randi(iMax,m,n)        % 生成m×n的1:iMax之间的均匀分布随机数
R = randi([iMin,iMax],m,n) % 生成m×n的iMin:iMax之间的均匀分布随机数

例如:

R1 = randi(10,5,1);      % 生成5×1的1:10之间随机整数
R2 = randi([10,20],2,3); % 生成2×3的10:20之间随机整数

3:randn(...)

有时候我们希望生成的随机数是呈现正态分布的,而不是随机分布,这时候我们就需要使用randn函数了。它生成的随机数整体概率为正态分布,均值为0,方差为1。也就是说生成的数中出现0的概率最大,而越往无穷或者负无穷概率越小,但是出现的随机数可能为所有实数,只不过出现的概率不同。它的格式如下:

R = randn(N)   % 生成N×N个正态分布的随机数
R = randn(M,N) % 生成M×N个正态分布的随机数
例如:

R = randi(3);      % 生成3×3的正态分布的随机数

4:关于rand(‘state’,sum(clock))于rng用法的探究

首先需要知道Matlab中的rand()函数产生的是伪随机数。如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:


 
 
  1. >> rand( 'state', 0)
  2. >> rand( 3, 1)
  3. ans =
  4. 0. 9501
  5. 0. 2311
  6. 0. 6068
  7. >> rand( 'state', 1)
  8. >> rand( 3, 1)
  9. ans =
  10. 0. 9528
  11. 0. 7041
  12. 0. 9539
  13. >> rand( 'state', 0) %随机数结果复现了
  14. >> rand( 3, 1)
  15. ans =
  16. 0. 9501
  17. 0. 2311
  18. 0. 6068

个人理解这样做是为了使得随机产生的结果重新复现方便多次展示,但是在matlab官网上面说最好不要用这种方法应为在2012以后的版本提供了更好的函数rng,如下图:(强烈建议有什么问题还是去官网查手册详细,有各种例子,而且是官方解释:https://ww2.mathworks.cn/help/matlab/ref/rand.html?searchHighlight=rand&s_tid=doc_srchtitle

RandStream - 随机数流

    MATLAB 中的伪随机数来自一个或多个随机数流。生成随机数数组的最简单方法是使用 rand、randn 或
    randi。这些函数全部都依赖于同一均匀随机数流,称为全局流。您可以创建与全局流分开使用的其他流,使用它们的 rand、randi 或          randn方法生成随机数数组。您也可以创建随机数流并将其用作全局流。

 

4、稳定的重启分布rng 
  这里我们来看一下如何让每次程序运行生成的随机数都一样,主要借助的是rang函数,格式如下:

rng('default');
R = rand(1,5); % 每次程序运行生成恒定的1×5随机数


此外还有生成同样分布的表达方式:

s = rng;
R1 = rand(1,5);
rng(s);
R2 = rand(1,5); % R1和R2随机数一样

 

 

参考文章:

1:https://blog.csdn.net/linhd1102/article/details/51193812

2:https://ww2.mathworks.cn/help/matlab/ref/randi.html?searchHighlight=randi&s_tid=doc_srchtitle

3:https://blog.csdn.net/FX677588/article/details/72811673

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值