在前面matble中函数rand()中,介绍了rand()函数的一般用法,


通过rand()或者randn()函数使用‘seed’,‘state’,‘twister’来控制随机数发生器 ,例如

rand('twister',5489),就是matble重置随机生成数编译器,使在不同方法(算法)下有相同的初始化,同时又可以保证实验结果可以复现。

rand('seed',sd)
randn('seed',sd)
rand('state',s)
randn('state',s)
rand('twister',5489)

这些语法指的是不同类型的生成器,因此不再推荐它们,原因如下:

1)术语‘seed’与‘state’是生成器的错误名称。

2)所有上面这些生成器,除了‘twister’,其余都有缺陷。

3)它们不必要为rand与randn使用不同的生成器。

要评估替换现有代码中不鼓励语法的影响,请在MATLAB会话开始时执行以下命令:

warning('on','MATLAB:RandStream:ActivatingLegacyGenerators')
warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState')

替换语法说明 :

使用rng函数来控制,rand,randn,randi和所有其他随机数生成函数(如randperm,sprand等),所使用的共享生成器。因此要使用rng函数来替换现有语法,需要多花时间了解这些函数的功能。

rand(Generator,s)或randn(Generator,s)的第一个输入指定了发生器的类型

Generator='seed'     引用的是Matble的v4生成器

Generator='state'    引用的是Matble的v5生成器

Generator='twister'  引用的是Mersenne Twister生成器,这也是Matble现在使用的生成器

v4与v5生成器不在推荐,除非你试图精确复现随机数,在早期matble版本上。最简单的方式是更新代码采用rng函数

rng函数替换rand与randn中的generator,如下:

rand/randn Generator Namerng Generator Name
'seed''v4'
'state''v5uniform' (for rand)
                  or
'v5normal' (for randn)
'twister''twister' (recommended)

用整数种子初始化生成器的替换语法 

rand(Generator,sd)语法中整数种子sd的最常见用法是:
每次重复产生完全相同的随机数(例如,通过使用诸如0,1或3141879的种子)

尝试确保MATLAB总是在不同的运行中给出不同的随机数(例如,通过使用诸如sum(100 *clock)的种子)

下表显示了整数种子sd的替换语法。
第一列显示了rand和randn的不鼓励generator语法。
第二栏显示了如何用新的rng函数精确重现不鼓励generator的行为。 在大多数情况下,这是通过指定不再推荐的传统生成器类型(例如v4或v5生成器)完成的。
第三列显示了推荐的替代方案,它没有指定可选的generator类型输入到rng。 因此,如果您总是省略发生器输入,rand,randn和randi只使用MATLAB启动时使用的默认Mersenne Twister发生器。 在未来的版本中,当新的生成器取代Mersenne Twister时,此代码将使用新的默认值。

Discouraged rand/randn SyntaxNot Recommended: Reproduce Discouraged Behavior Exactly By Specifying Generator TypeRecommended Alternative: Does Not Override Generator Type
rand('twister',5489)rng(5489,'twister')rng('default')
rand('seed',sd)rng(sd,'v4')rng(sd)
randn('seed',sd)rng(sd,'v4')rng(sd)
rand('state',sd)rng(sd,'v5uniform')rng(sd)
randn('state',sd)rng(sd,'v5normal')rng(sd)
rand('seed',sum(100*clock))rng(sum(100*clock),'v4')rng('shuffle')

用状态向量初始化发生器的替换语法

rand(Generator,st)语法中状态向量(此处显示为st)的最常见用法是准确再现算法或迭代中特定点处生成的随机数。 例如,你可以使用这个向量来帮助调试。

rng函数改变了保存和恢复随机数生成器状态的模式,如下表所示。 左栏中的示例假定您使用的是v5统一生成器。 右列中的示例使用新的语法,并适用于您使用的任何生成器。

Discouraged Syntax Using rand/randn
New Syntax Using rng
% Save v5 generator state.//存储v5生成器的状态
st = rand('state');%比较变态,这里显示生成器的其内部状态

% Call rand.//调用rand
x = rand;

% Restore v5 generator state.//重置v5生成器
rand('state',st);

% Call rand again and hope //再次调用rand
% for the same results.//返回相同的结果
y = rand

% Get generator settings.
s = rng;

% Call rand.
x = rand;

% Restore previous generator 
% settings.
rng(s);

% Call rand again and 
% get the same results.
y = rand

下面用例子直观表示:(需要说明的是,所有三种生成器,产生随机数步骤一样,rand(generator)产生一些随机数,来初始化生成器)

1)v5生成器  一个随机数

>> st=rand('state') 


st =

    0.6923
    0.1646
    0.0845
    0.0686
    0.0371
    0.3854
    0.1653
    0.3752
    0.7297
    0.4534
    0.8596
    0.5685
    0.9848
    0.3742
    0.3715
    0.9499
    0.9774
    0.7428
    0.4958
    0.4157
    0.0777
    0.3299
    0.9429
    0.0906
    0.3091
    0.5518
    0.0350
    0.0018
    0.9854
    0.8229
    0.4586
    0.9710
         0
    0.0000
    0.0000

>> x=rand

x =

    0.6068

>> warning('on','MATLAB:RandStream:ActivatingLegacyGenerators')
warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState')
>> rand('state',st)
>> y = rand

y =

    0.6068

2)rng方式生成器   一个随机数

>> s=rng

s = 

     Type: 'Legacy'
     Seed: 'Not applicable'
    State: {1x6 cell}

>> x=rand

x =

    0.4860

>> rng(s)
>> y=rand

y =

    0.4860

>> 

1)v5随机数生成器,矩阵

>> st=rand('state')



st =


    0.6923
    0.1646
    0.5676
    0.3609
    0.0371
    0.3854
    0.1653
    0.3752
    0.7297
    0.4534
    0.8596
    0.5685
    0.9848
    0.3742
    0.3715
    0.9499
    0.9774
    0.7428
    0.4958
    0.4157
    0.0777
    0.3299
    0.9429
    0.0906
    0.3091
    0.5518
    0.0350
    0.0018
    0.9854
    0.8229
    0.4586
    0.9710
    0.0000
    0.0000
    0.0000


>> x=rand(4)


x =


    0.8913    0.8214    0.9218    0.9355
    0.7621    0.4447    0.7382    0.9169
    0.4565    0.6154    0.1763    0.4103
    0.0185    0.7919    0.4057    0.8936


>> rand('state',st)
>> y=rand(4)


y =


    0.8913    0.8214    0.9218    0.9355
    0.7621    0.4447    0.7382    0.9169
    0.4565    0.6154    0.1763    0.4103
    0.0185    0.7919    0.4057    0.8936

2)rng方法,生成随机数   矩阵

>> s=rng


s = 


     Type: 'Legacy'
     Seed: 'Not applicable'
    State: {1x6 cell}


>> rand(4)


ans =


    0.0579    0.1389    0.2722    0.4451
    0.3529    0.2028    0.1988    0.9318
    0.8132    0.1987    0.0153    0.4660
    0.0099    0.6038    0.7468    0.4186


>> rng(s)
>> rand(4)


ans =


    0.0579    0.1389    0.2722    0.4451
    0.3529    0.2028    0.1988    0.9318
    0.8132    0.1987    0.0153    0.4660
    0.0099    0.6038    0.7468    0.4186

 如果无法从不鼓励(不支持)语法升级

如果有代码不能或不允许修改,并且您知道它使用了令人沮丧的随机数生成器控制语法,请务必记住,当您使用该代码时,MATLAB将切换到传统模式。 在传统模式下,rand和randn由独立的发生器控制,每个发生器都有自己的设置。

调用rand函数在传统模式下,使用下列方法之一:

由'rand'('seed',...)控制的'v4'发生器

由rand('state',...)控制的'v5uniform'发生器

由rand('twister',...)控制的'twister'发生器

调用randn函数在传统模式下,使用下列方法之一:

由randn('seed',...)控制的‘v4’发生器,

由randn('state',...)控制的'v5normal'生成器,

如果您依赖的代码将MATLAB放入传统模式,请使用以下命令来退出遗留模式并返回到默认启动生成器:rng  default

如果无法从不鼓励(不支持)语法升级

如果有代码不能或不允许修改,并且您知道它使用了令人沮丧的随机数生成器控制语法,请务必记住,当您使用该代码时,MATLAB将切换到传统模式。 在遗留模式下,rand和randn由独立的发生器控制,每个发生器都有自己的设置。

或者,为了防止让MATLAB代码进入传统模式,使用:

s = rng   %保存发电机的当前设置。
    ...       %使用传统随机数生成器语法调用代码。
rng(s)%恢复发电机的先前设置。


更多推荐

matble中函数rand()随机数生成器(二)