介绍
在MATLAB强化学习工具箱的大部分demo中,都有对随机数种子的重置。
中,随机数种子重置语句为:
setdemorandstream(491218382)
中,随机数种子重置语句为:
rng(0)
效果如下所示。可以看到随机数种子重置后,每次生成的伪随机数序列是相同的。便于在多次仿真中互相对比其他因素。
>> s = rng(0);x = rand(1,5)
x =
0.2190 0.0470 0.6789 0.6793 0.9347
>> s = rng(0);x = rand(1,5)
x =
0.2190 0.0470 0.6789 0.6793 0.9347
>> s = rng(0);x = rand(1,5)
x =
0.2190 0.0470 0.6789 0.6793 0.9347
本文简单对目前发现较常用的两个函数进行说明。
setdemorandstream函数
setdemorandstream函数如下所示,核心调用的是RandStream,而且采用的伪随机数生成算法为‘mcg16807’
function setdemorandstream(n)
%SETDEMORANDOMSTREAM Set default stream for reliable example results.
%
% SETDEMORANDOMSTREAM(N) is less distracting in example code, but
% equivalent to:
%
% rs = RandStream('mcg16807','Seed',n);
% RandStream.setGlobalStream(rs);% Copyright 2011-2012 The MathWorks, Inc.
rs = RandStream('mcg16807','Seed',n);
RandStream.setGlobalStream(rs);
根据RandStream函数的帮助文档,可用的伪随机数生成算法如下:
Name | Generator | Multiple Stream and Substream Support | Approximate Period In Full Precision |
---|---|---|---|
'mt19937ar' | Mersenne Twister (used by default stream at MATLAB startup) | No | 219937-1 |
'dsfmt19937' | SIMD-Oriented Fast Mersenne Twister | No | 219937-1 |
'mlfg6331_64' | Multiplicative lagged Fibonacci generator | Yes | 2124 (251 streams of length 272) |
'mrg32k3a' | Combined multiple recursive generator | Yes | 2191 (263 streams of length 2127) |
'philox4x32_10' | Philox 4x32 generator with 10 rounds | Yes | 2193 (264 streams of length 2129) |
'threefry4x64_20' | Threefry 4x64 generator with 20 rounds | Yes | 2514 (2256 streams of length 2258) |
'shr3cong' | Shift-register generator summed with linear congruential generator | No | 264 |
'swb2712' | Modified subtract with borrow generator | No | 21492 |
'mcg16807' | Multiplicative congruential generator | No | 231-2 |
rs = RandStream('mcg16807','Seed',n)的含义是定义了一个随机数流,采用‘mcg16807’伪随机数算法根据提供的种子n生成随机数。
rs =
mcg16807 random stream
Seed: 0
NormalTransform: Polar
RandStream.setGlobalStream(rs)将此设置状态告知全局随机数生成器,函数说明如下:
Set global random number stream
rng函数
rng函数的使用如下:
s = rng(seed)
在RandStream.setGlobalStream的函数帮助文档中,专门提到:
Note The rng function is a shorter alternative for many common uses of RandStream.setGlobalStream
说明,RandStream.setGlobalStream函数与rnd函数的功能是相同的。
但是两者也有区别。setdemorandstream采用的随机数生成算法为‘mcg16807
’;而rng(‘default’)默认的是‘twister’,对应的算法为‘mt19937ar’。以下为rng函数帮助文档中的说明
Value | Generator Name | Generator Keyword |
---|---|---|
'twister' | Mersenne Twister | mt19937ar |
'simdTwister' | SIMD-oriented Fast Mersenne Twister | dsfmt19937 |
'combRecursive' | Combined multiple recursive | mrg32k3a |
'multFibonacci' | Multiplicative Lagged Fibonacci | mlfg6331_64 |
'philox' | Philox 4x32 generator with 10 rounds | philox4x32_10 |
'threefry' | Threefry 4x64 generator with 20 rounds | threefry4x64_20 |
在 MATLAB versions 4.0和5.0时代,选项如下。默认的也是‘mcg16807’。
Value | Generator Name | Generator Keyword |
---|---|---|
'v4' | Legacy MATLAB version 4.0 generator | mcg16807 |
'v5uniform' | Legacy MATLAB version 5.0 uniform generator | swb2712 |
'v5normal' | Legacy MATLAB version 5.0 normal generator | shr3cong |