这个RandStream
类允许您创建随机数流。这有几个原因很有用。例如,您可能希望在不影响全局流状态的情况下生成随机值。您可能希望在模拟中单独的随机源。或者您可能需要使用不同的发电机算法而不是一个matlab®软件在启动时使用。和RandStream
构造函数时,可以创建自己的流,设置可写属性,并使用它生成随机数。你可以像控制全局流一样控制你创建的流。你甚至可以用你创建的流替换全局流。
要创建流,请使用RandStream
构造函数。
myStream=RandStream('mlfg6331_64');兰德(myStream,1,5)ans=0.6530 0.8147 0.7167 0.8615 0.0764
随机流我的直播
与全局流分开操作。功能兰德
,randn
,兰迪
将继续从全球流中提取,并且不会影响RandStream
方法兰德
,randn
和兰迪
应用于我的直播
.
你可以我的直播
全球流使用RandStream.setGlobalStream
方法。
RandStream.setGlobalStream RandStream (myStream)。getGlobalStream ans = mlfg6331_64随机流(当前全局流)种子:0 NormalTransform: Ziggurat RandStream。getGlobalStream==myStream ans = 1
您可能想回到模拟的前一部分。随机流可以通过跳转到固定的检查点(称为子流)来控制。这个Substream
属性允许您在多个子流之间来回跳转。使用Substream
属性,使用支持子流的生成器创建流。金宝app(见选择随机数发生器获取生成器算法及其属性的列表。)
流= RandStream(“mlfg6331_64”);RandStream.setGlobalStream(流)
初始价值Substream
是1。
流。子流ans = 1
子流可用于串行计算。通过返回到流中的特定检查点,可以重新创建所有或部分模拟。例如,它们可以在循环中使用。
对于i=1:5的流,子流=i;兰德(1,i)末端ans=0.6530 ans=0.3364 0.8265 ans=0.9539 0.6446 0.4913 ans=0.0244 0.5134 0.6305 0.6534 ans=0.3323 0.9296 0.5767 0.1233 0.6934
每个子流都可以重现其循环迭代。例如,您可以返回到第5个子流。结果将返回与上面第5个输出相同的值。
stream.Substream = 5;Rand (1,5) ans = 0.3323 0.9296 0.5767 0.1233 0.6934
MATLAB提供了几个生成器算法选项。下表总结了可用生成器算法的关键属性和用于创建它们的关键字。要返回所有可用生成器算法的列表,请使用RandStream.list
方法。
关键词 | 发电机 | 支持多流和子流金宝app | 全精度近似周期 |
---|---|---|---|
MT19937AR. | Mersenne Twister(由Matlab Startup默认流使用) | 没有 | 2.19937年-1 |
DSFMT19937. | 面向SIMD的快速梅森捻线机 | 没有 | 2.19937年-1 |
MCG16807. | 可乘同余发电机 | 没有 | 2.31-2 |
mlfg6331_64 | 乘法滞后斐波那契发生器 | 是的 | 2.124(251长度溪流272.) |
MRG32K3A | 组合多重递归发生器 | 是的 | 2.191.(263长度溪流2127) |
philox4x32_10 | Philox 4x32发电机,10发 | 是的 | 2.193.(264长度溪流2129) |
ThreeFry4x64_20 | 三级4x64发电机20轮 | 是的 | 2.514(2256长度溪流2258) |
shr3cong | 换档寄存器发生器与线性总体生成器一起求和 | 没有 | 2.64 |
swb2712 | 带借用生成器的改进减法 | 没有 | 2.1492 |
发电机的MCG16807.
,shr3cong
,swb2712
提供与MATLAB早期版本的向后兼容性。MT19937AR.
和DSFMT19937.
主要是为顺序应用程序设计的。其余的生成器提供了对并行随机数生成的显式支持。金宝app
根据应用程序,一些生成器可能更快或更高的值更精确。所有伪随机数发生器都基于确定性算法,所有算法都将失败对随机性的足够特定的统计测试。检查Monte Carlo仿真结果的一种方法是通过两个或更多不同的发电机算法重新运行模拟,Matlab软件的发电机选择为您提供了这样做的方法。虽然在使用不同的发电机时,您的结果不太可能与Monte Carlo采样错误不同,但在文献中有示例,其中这种验证在特定的生成器算法中已出现缺陷(参见[13]例如)。
MT19937AR.
梅森捻线机,如中所述[11],有句号
每个U(0,1)值都是使用两个32位整数创建的。可能的值是
在区间(0,1)内。此生成器不支持多流或子流。金宝app这个randn
默认使用的算法MT19937AR.
流是Ziggurat算法[7],但与MT19937AR.
发电机在下面。注:此发电机与制造商使用的发电机相同兰德
函数开始于MATLAB版本7,激活由兰特('twister',s)
.
DSFMT19937.
双精度simd导向的快速梅森龙卷风,描述在[12],是一个更快的梅森龙卷风算法的实现。周期是 可能的值是 在区间(0,1)内。生成器在[1,2)中生成双精度值,将其转换为U(0,1)值。此生成器不支持多流或子流。金宝app
MCG16807.
一种32位的乘法同余生成器,如[14],乘数
,modulo.
.这个发电机有一段时间
并且不支持多个流或子流。每金宝app个U(0,1)
使用生成器中的单个32位整数创建值;可能的值都是
严格在间隔内(0,1)
.这个randn
默认使用的算法MCG16807.
streams是极坐标算法(如中所述)[1])注:此生成器与从MATLAB版本4开始由两个兰德
和randn
功能,激活使用兰特('种子',s)
或Randn('种子',s)
.
mlfg6331_64
如上所述,一个64位乘法滞后的Fibonacci发生器[10],滞后
,
. 该生成器类似于SPRNG包中实现的MLFG。它的周期大约为
.它支持金宝app到
并行流,通过参数化,和
每个长度的子流
.每一个U(0,1)
使用生成器中的一个64位整数创建值;可能的值都是严格在区间(0,1)内。这个
randn
默认使用的算法mlfg6331_64
流是Ziggurat算法[7],但与mlfg6331_64
发电机。
MRG32K3A
一种32位组合多重递归生成器,如[2].此生成器类似于RNGSTREAMS包中实现的CMRG。它有一段时间
并支持多金宝app达
通过序列拆分的并行流,每个长度
.它还支持金宝app
子流,每个长度
.每一个U(0,1)
使用来自发电机的两个32位整数创建值;可能的值是倍数
严格在区间(0,1)内。这个randn
默认使用的算法MRG32K3A
流是Ziggurat算法[7],但与MRG32K3A
发电机。
philox4x32_10
一个带有10发子弹的4x32发电机[15]. 该生成器使用Feistel网络和整数乘法,专为GPU等高度并行系统的高性能而设计。它的周期为2193.(264长度溪流2129).
ThreeFry4x64_20
如中所述,配备20发的4x64发电机[15]. 此生成器是来自Skein哈希函数的Threefish分组密码的非加密改编。它的周期为2514(2256长度溪流2258).
shr3cong
Marsaglia的SHR3移位寄存器生成器与带乘法器的线性同余生成器求和
,加数
,和模量
. SHR3是一个三移位寄存器生成器,定义为
, 在哪里
是身份操作员,
是左移运算符,和R是右移算子。组合发电机(SHR3部分在[7])大约有一段时间
.此生成器不支持多流或子流。金宝app每个U(0,1)值使用生成器中的一个32位整数创建;可能的值都是
严格在区间(0,1)内。这个randn
默认使用的算法shr3cong
streams是ziggurat算法的早期形式[9],但与shr3cong
发电机。控件使用的生成器与此生成器相同randn
函数从MATLAB版本5开始,使用Randn('State',S)
.
swb2712
一种改进的带borrow的减法生成器,如[8]。此生成器类似于具有滞后27和12的加性滞后斐波那契生成器,但经过修改,其周期更长,约为
.生成器本身工作以双精度来创建U(0,1)值,并且开放间隔(0,1)中的所有值都是可能的。这个randn
默认使用的算法swb2712
流是Ziggurat算法[7],但与swb2712
发电机在下面。注:此发电机与制造商使用的发电机相同兰德函数从MATLAB版本5开始,使用兰特(状态,年代)
.
[1] 德夫罗耶,L。非均匀随机变化,Springer Verlag,1986年。
《组合多重递归随机数生成器的良好参数集》,运筹学,47(1):159-164。1999年。
[3] L'Ecuyer,P.和S.Côté。“使用拆分设施实现随机数包”,数学软件上的ACM事务, 17: 98–111. 1991
P. L'Ecuyer和R. Simard。《TestU01: A C Library for Empirical Testing of Random Number Generators》数学软件上的ACM事务,33(4):2007年第22项。
[5] L'Ecuyer,P.,R.Simard,E.J.Chen和W.D.Kelton。“具有许多长流和子流的面向对象的随机数包。”运筹学, 50(6):1073–1075. 2002.
[6] Marsaglia, G.《C的随机数:结束?》Usenet发布到sci.stat.math。1999.可以在网上https://groups.google.com/group/sci.crypt/browse_thread/
.
线程/ ca8682a4658a124d /
[7] Marsaglia G.和W. W. Tsang。“用于生成随机变量的Ziggurat方法。”统计软件, 5:1–7. 2000可在线获取,网址为https://www.jstatsoft.org/v05/i08
.
G. Marsaglia和A. Zaman。"一种新的随机数生成器"应用概率年鉴1(3): 462 - 480。1991.
[9] Marsaglia,G.和曾文伟。一种从递减或对称单峰密度函数中取样的快速、易于实现的方法暹罗J.Sci.Stat.Comput.5(2): 349 - 359。1984.
[10] 马斯卡尼,M.和A.斯里尼瓦桑。“参数化并行乘法滞后斐波那契发生器。”并行计算,30:899-916。2004年。
[11] 梅森捻线机:623维等分布均匀伪随机数发生器建模与计算机仿真汇刊,8(1):3-30。1998年。
[12] 使用仿射变换专门研究双精度浮点数的PRNG蒙特卡罗和准蒙特卡罗方法2008, 10.1007/978-3-642-04107-5_38. 2009.
[13] 摩尔,C.B。MATLAB的数值计算. 暹罗,2004年。可在线获取,网址为https://www.mathwands.com/moler.
[14] Park, s.k.和K.W. Miller。《随机数生成器:好随机数很难找到》ACM的通信, 31(10):1192–1201. 1998
鲑鱼,J. K., M. A. Moraes, R. O. Dror和D. E. Shaw。"平行随机数:和1 2 3一样简单"在高性能计算、网络、存储和分析国际会议论文集(SC11).纽约,纽约:ACM,2011。