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):由随机数组成的矩阵

>>R = rand(5)               %生成一个由介于 0 和 1 之间的均匀分布的随机数组成的 5×5 矩阵。

R =

    0.8147    0.0975    0.1576    0.1419    0.6557
    0.9058    0.2785    0.9706    0.4218    0.0357
    0.1270    0.5469    0.9572    0.9157    0.8491
    0.9134    0.9575    0.4854    0.7922    0.9340
    0.6324    0.9649    0.8003    0.9595    0.6787

>> R = rand(5,3,'double')    %生成double类型的5x3均匀分布的0到1间随机数

R =

    0.7577    0.7060    0.8235
    0.7431    0.0318    0.6948
    0.3922    0.2769    0.3171
    0.6555    0.0462    0.9502
    0.1712    0.0971    0.0344

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

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

>> r = -5 + (5+5)*rand(10,1)     %生成一个由区间 (-5,5) 内均匀分布的数字组成的 10×1 列向量。

r =

   -0.6126
   -1.1844
    2.6552
    2.9520
   -3.1313
   -0.1024
   -0.5441
    1.4631
    2.0936
    2.5469

(3):随机复数


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

a =

   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),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:

>> rand('state',0)
>> rand(3,1)

ans =

    0.9501
    0.2311
    0.6068

>> rand('state',1)
>> rand(3,1)

ans =

    0.9528
    0.7041
    0.9539

>> rand('state',0)  %随机数结果复现了
>> rand(3,1)

ans =

    0.9501
    0.2311
    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

发布了27 篇原创文章 · 获赞 6 · 访问量 5084

猜你喜欢

转载自blog.csdn.net/qq_21449473/article/details/101111014