PSYCHTOOLBOX工具箱及MATLAB编程实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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