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

  • 33
    点赞
  • 290
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: rand: rand函数MATLAB的一个随机数生成函数,用于产生范围在0到1之间均匀分布的随机数。其语法为rand(),不带参数时返回一个随机数,可以通过设置参数来生成多个随机数。例如,rand(3,4)将返回一个3行4列的矩阵,其的元素为0到1之间的随机数。 randn: randn函数MATLAB的一个随机数生成函数,用于产生符合正态分布(均值为0,方差为1)的随机数。其语法与rand函数类似,randn()返回一个符合正态分布的随机数,可以通过设置参数来生成多个随机数。例如,randn(3,4)将返回一个3行4列的矩阵,其的元素为符合正态分布的随机数。 randi: randi函数MATLAB的一个随机数生成函数,用于产生整数随机数。其语法为randi(n)或randi([a,b]),n代表随机数的上限,生成的随机数范围为1到n;[a,b]代表随机数的范围,生成的随机数范围为a到b。例如,randi(10)将返回一个1到10之间的整数随机数,randi([5,10])将返回一个5到10之间的整数随机数。与randrandn函数类似,randi函数也可以通过设置参数来生成多个随机数。例如,randi([1,10],3,4)将返回一个3行4列的矩阵,其的元素为1到10之间的整数随机数。 ### 回答2: rand函数MATLAB的一个随机数生成函数,用于生成一个0到1之间的均匀分布的随机数。可以设置生成的随机数的维度和大小。例如,使用rand函数生成一个3x3的随机矩阵: x = rand(3,3) 运行结果可能如下: 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 randn函数也是一个随机数生成函数,用于生成服从标准正态分布的随机数。它生成的随机数具有零均值和单位方差。和rand函数类似,可以设置生成随机数的大小和维度。例如,使用randn函数生成一个2x2的随机矩阵: y = randn(2,2) 运行结果可能如下: 0.5377 0.3188 1.8339 -0.3150 randi函数MATLAB的一个随机整数生成函数,用于生成指定范围内的随机整数。可以设置生成随机整数的大小、范围和维度。例如,使用randi函数生成一个1到10之间的3x1的随机整数向量: z = randi([1,10],3,1) 运行结果可能如下: 7 3 9 这三个函数MATLAB的应用非常广泛,可以用于生成随机数进行模拟、随机样本生成、数值计算或其他需要应用到随机数的情况。 ### 回答3: matlab函数rand产生一个0到1之间的随机数或多个0到1之间的随机数矩阵。它是基于均匀分布的随机数生成器。使用rand函数时,可以通过指定参数矩阵的大小来生成想要的随机数矩阵。例如,rand(2, 3)将生成一个2行3列的随机数矩阵。 matlab函数randn也是用来生成随机数,但是它是基于正态分布的。与rand函数不同,randn函数生成的随机数具有均值为0和方差为1的正态分布。 matlab函数randi用来生成随机整数。它可以生成介于两个给定整数之间的一个随机整数。例如,randi(10)将生成一个介于1到10之间的随机整数。同时,也可以指定生成整数的范围和大小。例如,randi([5, 15], 2, 3)将生成一个2行3列,取值范围在5到15之间的随机整数矩阵。 总之,这三个函数都是用来生成随机数的,但是它们所基于的分布不同。rand是基于均匀分布,randn是基于正态分布,randi则是生成随机整数。根据具体的需求,可以选择适合的函数来生成所需要的随机数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值