5.4 随机操作类函数
5.4.1 介于[0,1]间的均匀分布随机浮点数:rand
◆ r=rand(n)
返回[0,1]区间内的n×n的随机矩阵。
例如:
>> rand(5)↙
ans = 0.7303 0.9631 0.6241 0.0377 0.2619 0.4886 0.5468 0.6791 0.8852 0.3354 0.5785 0.5211 0.3955 0.9133 0.6797 0.2373 0.2316 0.3674 0.7962 0.1366 0.4588 0.4889 0.9880 0.0987 0.7212
◆ r=rand([m,n])
◆ r=rand(m,n)
返回[0,1]区间内的m×n的随机矩阵。
例如:
>> rand(3,2)↙
ans = 0.1068 0.7791 0.6538 0.7150 0.4942 0.9037
>> rand([3,2])↙
ans = 0.8909 0.1978 0.3342 0.0305 0.6987 0.7441
◆ r=rand(m,n,p,…)
◆ r=rand([m,n,p,…])
返回[0,1]区间内的m×n×p的多维随机矩阵。
例如:
>> rand(3,2,2)↙
ans(:,:,1) = 0.5000 0.6099 0.4799 0.6177 0.9047 0.8594 ans(:,:,2) = 0.8055 0.2399 0.5767 0.8865 0.1829 0.0287
◆ r=rand
返回[0,1]区间内的一个随机数
例如:
>> rand↙
ans = 0.4899
◆ r=rand(size(A))
根据矩阵A的维度建立[0,1]区间的相同维度的随机矩阵。
例如:
>> A=ones(3,4);↙ >> rand(size(A))↙
ans = 0.9786 0.8707 0.1489 0.5952 0.2760 0.8878 0.1693 0.8515 0.0428 0.3720 0.1628 0.0441
◆ r=rand(…,'double')
◆ r=rand(…,'single')
根据指定的数据类型('double',双精度型,'single',单精度型),返回[0,1]区间内的随机数(矩阵),精度越高,存储相同的内容所需的字节数越多。
例如:
>> r=rand(4,4,'double');↙ >> whos r↙
Name Size Bytes Class Attributes r 4x4 128 double
>> r=rand(4,4,'single');↙ >> whos r↙
Name Size Bytes Class Attributes r 4x4 64 single
返回指定区间[a,b]内的一个随机数
r=a+(b-a)*rand;
返回指定区间[5,10]内的100 000个随机数
>>r=5+(10-5)*rand(100000,1);↙ >> hist(r,200)↙
结果(见图5-3):
图5-3 随机均匀分布图
注意:m,n,p值不能为负,否则视为0处理。
5.4.2 介于[1,n]间的均匀分布随机整数:randi
◆ r=randi(imax)
返回介于[1,imax]间的随机整数。
例如:
>> randi(100)↙
ans = 26
◆ r = randi(imax,n)
返回介于[1,imax]间的n×n随机整数矩阵。
例如:
>> randi(100,3)↙
ans = 63 25 67 52 7 71 50 17 86
◆ r=randi(imax,m,n)
◆ r=randi(imax,[m,n])
返回介于[1,imax]间的m×n随机整数矩阵。
例如:
>> randi(100,3,5)↙
ans = 23 2 96 9 44 52 98 85 74 15 26 90 39 69 31
◆ r=randi(imax,m,n,p,...)
◆ r=randi(imax,[m,n,p,...])
返回介于[1,imax]间的m×n×p多维随机整数矩阵。
例如:
>> randi(100,3,5,2)↙
ans(:,:,1) = 69 65 19 66 30 51 7 47 82 19 74 100 57 78 85 ans(:,:,2) = 66 62 49 56 73 61 38 47 58 21 48 87 31 15 28
◆ r=randi(imax,size(A))
根据矩阵A的维度建立[1,imax]区间的相同维度的随机矩阵。
例如:
>> A=ones(3,4);↙ >> randi(100,size(A))↙
ans = 70 21 33 9 20 14 49 32 43 82 7 32
◆ r = randi([imin,imax],...)
返回介于[imin,imax]区间内的随机整数(矩阵)。
例如:
>> randi([10 100])↙
ans = 29
>> randi([10 100],3,6)↙
ans = 18 24 13 65 25 56 26 34 16 34 83 93 27 26 12 52 11 78
◆ r = randi(..., classname)
根据指定的数据类型(如'uint8'、'uint16'、'uint32'、'int8'、'int16'、'int32'),返回[1,n]区间内的随机整数(矩阵),精度越高存储相同的内容所需的字节数越多。
例如:
>> randi([-10 10],'int8')↙
ans = -3
>> randi([-10 10],'uint8')↙ %因数据类型为无符号整数,不会产生负的随机数
ans = 8
注意:m,n,p值不能为负,否则视为0处理。
5.4.3 正态分布随机数:randn
◆ r = randn(n)
返回均值≈0,标准差≈1的n×n正态分布随机矩阵。
例如:
>> randn(5)↙
ans = -2.2096 1.1865 -1.8786 0.3835 0.8283 -0.3001 1.3006 2.7685 1.3123 -1.6586 1.0508 -0.9875 0.8320 0.4512 -0.6254 -0.6552 -0.3753 -1.2674 -2.4017 -0.4416 -0.2650 0.2172 -0.0199 -0.4903 0.3065
◆ r = randn(m,n)
◆ r = randn([m,n])
返回均值≈0,标准差≈1的m×n正态分布随机矩阵。
例如:
>> mean(randn(1000,1))↙
ans = 0.0169
>> std(randn(1000,1))↙
ans = 0.9771
◆ r = randn(m,n,p,...)
◆ r = randn([m,n,p,...])
返回均值≈0,标准差≈1的m×n×p正态分布随机矩阵。
◆ r = randn(size(A))
根据矩阵A的维度建立相同维度的正态分布随机矩阵。
例如:
>> randn(size(ones(5)))↙
ans = 1.9914 2.0833 0.5350 1.1367 -0.0874 -0.2055 0.5954 1.1051 -0.7037 0.5650 1.0604 -0.5917 -1.9251 -0.1490 -1.1934 0.0899 0.1612 0.9024 0.4790 -0.4009 0.0809 -0.6363 -0.0076 -1.1318 0.6708
◆ r = randn(..., 'double')
◆ r = randn(..., 'single')
根据指定的数据类型('double',双精度型,'single',单精度型),返回相应数据类型的正态分布随机矩阵,精度越高存储相同的内容所需的字节数越多。
例如:
生成均值为1,标准差2的正态分布随机数组
>> r = 1 + 2.*randn(1000000,1);↙ >> hist(r,200)↙
结果(见图5-4):
图5-4 随机概率分布图
注意:m,n,p值不能为负,否则视为0处理。
5.4.4 设置随机数种子:seed
◆ rand('seed', seed)
◆ randn('seed', seed)
设置随机数种子后,就可以控制生成具有相同值的随机数列。例如,我们对实验的试次随机后,希望每个被试按照相同的随机序列完成实验。
例如:
>> rand('seed',1)↙ >> rand(1,5)↙
ans = 0.5129 0.4605 0.3504 0.0950 0.4337
>> rand(1,5)↙
ans = 0.7092 0.1160 0.0781 0.3693 0.0336
>> rand('seed',1)↙ >> rand(1,5)↙
ans = 0.5129 0.4605 0.3504 0.0950 0.4337
5.4.5 通过随机数流来控制随机数种子:RandStream
◆ RandStream.list
返回所有的随机数生成算法
例如:
>> RandStream.list↙
The following random number generator algorithms are available:
mcg16807: Multiplicative congruential generator,with multiplier 7^5,modulo 2^31-1 mlfg6331_64: Multiplicative lagged Fibonacci generator,with lags 63 and 31,64 bit(supports parallel streams) mrg32k3a: Combined multiple recursive generator(supports parallel streams) mt19937ar: Mersenne Twister with Mersenne prime 2^19937-1 shr3cong: SHR3 shift-register generator summed with CONG linear congruential generator swb2712: Modified Subtract-with-Borrow generator,with lags 27 and 12
◆ s = RandStream.create('gentype', 'param1', var1, 'param2', var2, …);
创建一个随机数流,其中gentype为RandStream.list返回值之一,param1、param2等为NumStreams (随机数流的个数),StreamIndices(随机数流的索引,默认为1:N,N为指定的随机数流个数),Seed (随机数流的初始化值,默认为0,介于0:232之间),RandnAlg(生成概率分布的算法,可取值为'Ziggurat'、'Polar'、'Inversion'),CellOutput(是否将随机数流作为单元数组的元素,默认为false)。
例如:
>> RandStream.create('mrg32k3a')↙
ans = mrg32k3a random stream Seed: 0
RandnAlg: Ziggurat
>> RandStream.create('mrg32k3a','NumStreams',3)↙
ans = mrg32k3a random stream StreamIndex: 1 NumStreams: 3 Seed: 0 RandnAlg: Ziggurat
>> RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',[],'Seed',5,'RandnAlg','Polar')↙
ans = mrg32k3a random stream StreamIndex: 1 NumStreams: 3 Seed: 5 RandnAlg: Polar
>> Ss=RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',[],'Seed',5,'RandnAlg','Polar','CellOutput',true)↙
Ss = [1x1 RandStream] [1x1 RandStream] [1x1 RandStream]
>> Ss{1}↙
ans = mrg32k3a random stream StreamIndex: 1 NumStreams: 3 Seed: 5 RandnAlg: Polar
>> [s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);↙ >>r1 = rand(s1,100000,1);↙ >>r2 = rand(s2,100000,1);↙ >>r3 = rand(s3,100000,1);↙ >>corrcoef([r1,r2,r3])↙ %输出相关系数矩阵
ans = 1.0000 0.0016 -0.0019 0.0016 1.0000 -0.0012 -0.0019 -0.0012 1.0000
◆ prevstream = RandStream.setDefaultStream(stream)
将stream设为默认的随机数流,stream由RandStream.create创建。
例如:
s = RandStream.create('mrg32k3a'); RandStream.setDefaultStream(s);
◆ stream = RandStream.getDefaultStream
获取默认的随机数流。
>> defaultStream = RandStream.getDefaultStream;↙ >> savedState = defaultStream.State;↙ >> u1 = rand(1,5)↙
u1 = 0.1461 0.5126 0.9024 0.3702 0.3298
>> defaultStream.State = savedState;↙ >> u2 = rand(1,5)↙ %u2中包含与u1相同的随机数
u2 = 0.1461 0.5126 0.9024 0.3702 0.3298
5.4.6 随机排列:randperm
p = randperm(n);
对1:n间的数列进行随机排序
例如:
>> randperm(5)↙
ans = 5 2 4 3 1
进行相同的随机排列
>> rand('seed',0)↙ >> randperm(5)↙
ans = 2 1 3 4 5
>> rand('seed',0)↙ >> randperm(5)↙
ans = 2 1 3 4 5
进行相同的随机排列
>> defaultStream = RandStream.getDefaultStream;↙ >> savedState = defaultStream.State;↙ >> randperm(10)↙
ans = 3 5 4 6 1 8 2 7 10 9
>> defaultStream.State = savedState;↙ >> randperm(10)↙
ans = 3 5 4 6 1 8 2 7 10 9
5.4.7 重置随机数流:reset
◆ reset(s)
◆ reset(s,seed)
将随机数流s重置。
例如:
>> s=RandStream.create('mt19937ar');↙ >> RandStream.setDefaultStream(s);↙ >> rand(s,1,5)↙
ans = 0.8147 0.9058 0.1270 0.9134 0.6324
>> reset(s)↙ >> rand(s,1,5)↙
ans = 0.8147 0.9058 0.1270 0.9134 0.6324
5.4.8 随机排列数组或矩阵:Shuffle
[Y,index] = Shuffle(X);
如果X为一维向量,则对其进行随机排序,转换为Y=X(index);如果X为m×n的矩阵,则按列方向随机排序。
例如:
>> a=1:10↙
a = 1 2 3 4 5 6 7 8 9 10
>> Shuffle(a)↙
ans = 6 2 8 7 9 1 5 10 3 4
>> repmat([1:10]',1,3)↙
ans = 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10
>> Shuffle(ans)↙
ans = 9 7 1 5 8 10 2 4 4 7 1 6 10 2 8 6 6 2 4 10 3 3 9 5 1 3 9 8 5 7
5.4.9 随机抽样:Sample
[Y,index] = Sample(X);
如果X是一维数组,则从中随机抽取一个值;如果X是m×n的两维数组,则从每一列中随机抽取一个值。其中index是抽取值在X中的索引,即Y=X(index)。
例如:
>>rand(5)↙
ans = 0.6279 0.1389 0.8611 0.5201 0.0445 0.7720 0.6963 0.4849 0.3477 0.7549 0.9329 0.0938 0.3935 0.1500 0.2428 0.9727 0.5254 0.6714 0.5861 0.4424
0.1920 0.5303 0.7413 0.2621 0.6878
>> Sample(ans)↙
ans = 0.7720 0.6963 0.4849 0.3477 0.7549
5.4.10 随机抽样:RandSample
x=RandSample(list,[dims])
从某个序列(list)中返回一个随机样本(x),如果指定第二个参数(dims),则返回指定维度的数组,list可以是浮点数、字符、单元或结构数组。
例如:
>> RandSample(-15:15)↙
ans = 14
>> RandSample(['a','b','c','d','e'])↙
ans = e
>> RandSample({'a','b','c','d','e'})↙
ans = 'a'
>> a(1).b=10;↙ >> a(2).b=15;↙ >> a(3).b=20;↙ >> RandSample(a)↙
ans = b: 20
>> RandSample(1:100,[3,3])↙
ans = 81 92 66 15 80 4 43 96 85