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
更多推荐
所有评论(0)