您的位置:首页 > 编程语言 > MATLAB

Matlab中的RandStream的应用场景

2010-11-26 15:04 363 查看
一,matlab中生成随机数主要有三个函数:rand, randn,randi

1,rand 生成均匀分布的伪随机数。分布在(0~1)之间

主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数

rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可以是'single'

rand(RandStream,m,n)利用指定的RandStream(我理解为随机种子)生成伪随机数

2,randn 生成标准正态分布的伪随机数(均值为0,方差为1)

主要语法:和上面一样

3, randi 生成均匀分布的伪随机整数

主要语法:randi(iMax)在开区间(0,iMax)生成均匀分布的伪随机整数

randi(iMax,m,n)在开区间(0,iMax)生成mXn型随机矩阵

r = randi([iMin,iMax],m,n)在开区间(iMin,iMax)生成mXn型随机矩阵

二,关于随机种子,伪随机数的重复生成

正常情况下每次调用相同指令例如rand生成的伪随机数是不同的,

例如:

rand(1,3)

rand(1,3)

matlab的输出为:

ans =

0.139043482536049 0.734007633362635 0.194791464843949

ans =

0.602204766324215 0.937923745019422 0.149285414707192

如何使两个语句生成的随机数相等呢?

Matlab帮助中的下面章节有所叙述:

Managing theDefault Stream

管理默认(缺省)流

rand,
randn, and
randidraw random numbers from anunderlying random number stream, called the default stream.The
@RandStream
class allows you to get a handle to the default streamand control random number generation.


rand,randn,和randi 从一个基础的随机数流中得到随机数,叫做默认流。你可以通过@RandStream 类得到默认流的句柄从而控制随机数的生成。

Get a handle to the default stream asfollows:

以下为得到默认流句柄的代码:

defaultStream=RandStream.getDefaultStream

defaultStream =

mt19937ar random stream (current default)
Seed: 0
RandnAlg: Ziggurat

Return the properties of the stream object with the
get

method:

用get方法返回流对象属性:

get(defaultStream)
Type: 'mt19937ar'
NumStreams: 1
StreamIndex: 1
Substream: 1
Seed: 0
State: [625x1 uint32]
RandnAlg: 'Ziggurat'
Antithetic: 0
FullPrecision: 1

The State
property is the internal state of the generator. You can save the State
of defaultStream
.

state属性是发生器的内部状态,你可以保存默认流的状态:

myState=defaultStream.State;

Using myState
, you can restore the state of defaultStream
and reproduce previous results.

利用myState你可以恢复默认流状态重新生成前面的结果:

myState=defaultStream.State;
A=rand(1,100);
defaultStream.State=myState;
B=rand(1,100);
isequal(A,B)

ans =

1

你也可以直接使用@RandStream

类的reset静态方法重置种子状态来获取相同的随机生成序列,下面是示例代码:

stream =RandStream.getDefaultStream;%获取默认的随机种子(暂时这么叫,帮助有详细解释)

reset(stream);%重置

rand(stream,1,3)

reset(stream);%重置

rand(stream,1,3)

matlab的输出为:

ans =

0.814723686393179 0.905791937075619 0.126986816293506

ans =

0.814723686393179 0.905791937075619 0.126986816293506

可以看出生成的随机码是相等的,这样可以用于重复实验上来

-------以上为转载部份-------------转载处:新浪博客--无名指

以上的说明表RandStream可以完成相同随机数的生成,这对于结果的可重复性是至关重要的。

下面从另一个方面,说明RandStream的应用场景,例如:

第一次在matlab运行程序的过程中我们生成了100个rand的随机数,然后退出了matlab.

第二次我们又在matlab中运行这个程序,那么,这次生成的100的rand随机数,实际上与第一次中的100个rand随机数是一样的,因此,这两次程序的运行结果将会一样,保证了结果的可重复性。

但是,往往,有这样的应用,在机器学习和模式识别中,我们要检验一个算法的稳健性,往往要在同个数据集上,运行多次,然后取平均值表明为这个算法的在这个数据集上的性能。假设运行100次,当要完成这100次所花费的时间很长时,自然我们想到,在n 个matlab中分开运行这100次,每个运行100/n次,为了得到每个运行结果的不一样,就需要运用RandStream

[s1,...,sn] = RandStream.create('mrg32k3a','NumStreams',n);

%得到新的stream

s = RandStream.getDefaultStream; %保存原有的默认stream

RandStream.setDefaultStream(si); %重置默认stream

%%%%%%run procedure%%%%%

RandStream.setDefaultStream(s); %还原默认stream

这样就保证了每个matlab运行的结果不一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: