文档

创建和控制随机数流

RandStream类允许您创建随机数流。这有几个原因。例如,您可能希望在不影响全局流状态的情况下生成随机值。您可能希望在模拟中使用单独的随机源。或者您可能需要使用与MATLAB不同的生成器算法®启动时使用的软件。与RandStream构造函数时,可以创建自己的流,设置可写属性,并使用它生成随机数。你可以像控制全局流一样控制你创建的流。你甚至可以用你创建的流替换全局流。

要创建流,请使用RandStream构造函数。

myStream = RandStream(“mlfg6331_64”);rand(myStream,1,5) ans = 0.6530 0.8147 0.7167 0.8615 0.0764

随机流myStream与全球流分开操作。的函数兰德randn兰迪将继续吸取全球的潮流,并将不会影响的结果RandStream方法兰德randn兰迪应用于myStream

你可以让myStream使用RandStream.setGlobalStream方法

RandStream.setGlobalStream RandStream (myStream)。getGlobalStream ans = mlfg6331_64随机流(当前全局流)种子:0 NormalTransform: Ziggurat RandStream。getGlobalStream==myStream ans = 1

子流

您可能想回到模拟的前一部分。随机流可以通过跳转到固定的检查点(称为子流)来控制。的Substream属性允许您在多个子流之间来回跳转。使用Substream属性,使用支持子流的生成器创建流。万博1manbetx(见选择随机数生成器获取生成器算法及其属性的列表。)

流= RandStream(“mlfg6331_64”);RandStream.setGlobalStream(流)

初始值Substream是1。

流。子流ans=1

子流在串行计算中很有用。子流可以通过返回到流中的特定检查点来重新创建模拟的全部或部分。例如,它们可以在循环中使用。

我= 1:5 stream.Substream =;Rand (1,i) end 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方法

生成算法

关键字 发电机 支持多流和子流万博1manbetx 全精度的近似周期
mt19937ar 梅森素数捻线机(默认) 2 19937 1
dsfmt19937 面向simd的快速梅森龙卷风 2 19937 1
mcg16807 可乘同余发电机 2 31 2
mlfg6331_64 乘法滞后的斐波那契生成器 是的 2 124
mrg32k3a 组合多重递归发生器 是的 2 191
shr3cong 移位寄存器发生器与线性同余发生器求和 2 64
swb2712 用借用生成器修改了减法 2 1492

一些发电机(mcg16807shr3congswb2712)提供与较早版本的MATLAB的向后兼容性。两个发电机(mrg32k3amlfg6331_64)为并行随机数生成提供显式支持。其余生万博1manbetx成器(mt19937ardsfmt19937)主要为顺序应用程序而设计。根据应用程序的不同,某些生成器可能更快或更精确地返回值。

选择生成器的另一个原因与应用程序有关。所有伪随机数生成器都是基于确定性算法的,并且它们都将无法通过一个足够具体的随机统计测试。检查蒙特卡洛模拟结果的一种方法是用两个或更多不同的生成器算法重新运行模拟,MATLAB软件的生成器选择为您提供了这样做的方法。尽管当使用不同的生成器时,你的结果不太可能会有比蒙特卡罗抽样误差更大的差异,但在文献中有这样的例子,这种验证在特定的生成器算法中出现了缺陷(见[13]一个例子)。

发生器算法

mcg16807

一种32位的乘法同余生成器,如[14],乘数 一个 7 5 ,模 2 31 1 .此发电机的周期为 2 31 2 且不支持多流或子流。万博1manbetx每一个U (0,1)值使用生成器中的单个32位整数创建;可能的值都是 2 31 1 1 严格地在区间内(0,1)这个randn默认使用的算法mcg16807Streams是极坐标算法(见[1]).注意:此生成器与在MATLAB Version 4中开始使用的生成器相同兰德randn功能,使用兰特(种子,年代)randn(种子,年代)

mlfg6331_64

一个64位乘法滞后斐波那契生成器,如[10],滞后 l 63 k 31 .这个生成器类似于在spring包中实现的MLFG。它的周期大约是 2 124 。它支持多万博1manbetx达 2 61 并行流,通过参数化,和 2 51 每个长度的子流 2 72 .每一个U (0,1)值是使用生成器中的一个64位整数创建的;可能的值都是严格地在区间(0,1)内。的randn默认使用的算法mlfg6331_64streams是ziggurat算法[7],但与mlfg6331_64发电机。

mrg32k3a

一种32位组合多重递归生成器,如[2]。此生成器类似于在RngStreams包中实现的CMRG。它的周期为 2 191 并支持到万博1manbetx 2 63 并行流通过序列分割,每个长度 2 127 .它还支持万博1manbetx 2 51 子流,每个长度 2 76 .每一个U (0,1)值是使用生成器中的两个32位整数创建的;可能的值是 2 53 严格地在区间(0,1)内。的randn默认使用的算法mrg32k3astreams是ziggurat算法[7],但与mrg32k3a发电机。

mt19937ar

梅森龙卷风,如[11]期, 2 19937 1 每个U(0,1)值使用两个32位整数创建。可能的值是的倍数 2 53 在间隔(0,1)中。此生成器不支持多个流或子流万博1manbetxrandn默认使用的算法mt19937arstreams是ziggurat算法[7],但与mt19937ar发电机。注意:此生成器与兰德函数从MATLAB版本7开始,由激活兰特(捻线机,年代)

dsfmt19937

双精度SIMD定向快速Mersenne捻线机,如中所述[12],是Mersenne Twister算法的更快实现。周期为 2 19937 1 可能的值是 2 52 在区间(0,1)内。生成器在[1,2)中生成双精度值,将其转换为U(0,1)值。此生成器不支持多流或子流。万博1manbetx

shr3cong

Marsaglia的SHR3移位寄存器发生器用带乘子的线性同余发生器求和 一个 69069 ,加数 b 1234567 和模量 2 32 .SHR3是一个三移位寄存器发生器,定义为 u u + l 13 + R 17 + l 5 ,在那里 是恒等算子, l 是左换档操作员,并且R是右移算子。组合发电机(SHR3部分在[7])的周期约为 2 64 .此生成器不支持多流或子流。万博1manbetx每个U(0,1)值使用生成器中的一个32位整数创建;可能的值都是 2 32 严格地在区间(0,1)内。的randn默认使用的算法shr3congStreams是ziggurat算法的早期形式[9],但与shr3cong发电机。控件使用的生成器与此生成器相同randn函数开始于MATLAB版本5,激活使用randn(状态,年代)

请注意

SHR3发生器用于[6](1999)不同于[7]MATLAB使用了最新版本的生成器,如中所示[7]

swb2712

使用借用生成器修改的减法,如中所述[8].这个生成器类似于一个滞后27和12的加性滞后斐波那契生成器,但是经过修改,大约有一个更长的周期 2 1492 这个generator works natively in double precision to create U(0,1) values, and all values in the open interval (0,1) are possible. Therandn默认使用的算法swb2712streams是ziggurat算法[7],但与swb2712发电机。注意:这个生成器与在MATLAB版本5中开始使用的rand函数相同,使用激活兰特(状态,年代)

转换算法

反演

通过将标准正态逆累积分布函数应用于均匀随机变量来计算正态随机变量。每个正常值仅消耗一个统一值。

极地的

极性拒绝算法,如[1].每个正常值平均消耗约1.27个统一值。

金字形神塔

ziggurat算法,如[7].每个正常值平均消耗约2.02个统一值。

工具书类

[1] Devroye, L. Non-Uniform Random Variate Generation, Springer-Verlag, 1986。

李国栋,李国栋,李国栋。“组合递归随机数生成器的良好参数集”,运筹学研究,47(1):159-164。1999.

[3] L'Ecuyer, p.s. Côté。“用分裂工具实现随机数包”,《数学软件学报》,17:98-111。1991.

P. L'Ecuyer和R. Simard。“TestU01:随机数字生成器经验测试的C语言库”,《数学软件学报》,33(4):第22条。2007.

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。可在线访问http://groups.google.com/group/sci.crypt/browse_thread/
线程/ ca8682a4658a124d /

[7] 生成随机变量的ziggurat方法〉,《统计软件杂志》,5:1-7.2000。可在线访问http://www.jstatsoft.org/v05/i08

G. Marsaglia和A. Zaman。"一种新的随机数生成器"应用概率年鉴1(3):462-480。1991.

Marsaglia G.和w.w. Tsang。一种快速、易于实现的方法,用于从减少的或对称的单峰密度函数中取样。暹罗J.Sci.Stat.Comput。5(2): 349 - 359。1984.

[10] 参数化并行乘法滞后斐波那契发生器〉,《并行计算》,30:899–916.2004。

[11] Matsumoto, M., T. Nishimura。梅森龙卷风:623维等分布均匀伪随机数发生器计算机仿真学报,32(1):1 - 8。1998.

[12] Matsumoto M.和M. Saito。一种专门用于使用仿射转换的双精度浮点数的PRNG蒙特卡罗方法与拟蒙特卡罗方法2008,10.1007/978-3-642-04107-5_38。2009.

[13] Moler, C.B. MATLAB数值计算。暹罗,2004年。可以在网上//www.tianjin-qmedu.com/moler

[14] Park, s.k.和K.W. Miller。《随机数生成器:好随机数很难找到》ACM通信,31(10):1192-1201。1998.