主要内容

创建和控制一个随机数流

RandStream类允许您创建一个随机数流。这是有用的几个原因:

  • 您可以生成随机值而不影响全球流的状态。

  • 你可以单独的随机性的来源在一个模拟世界中。

  • 您可以使用一个生成器,比一个MATLAB配置不同®软件在启动时使用。

与一个RandStream对象,您可以创建自己的流,设置可写属性,使用流生成随机数。你可以控制流创建相同的方式控制全球流。你甚至可以取代您创建的全球流的流。

创建一个流,使用RandStream函数。

myStream = RandStream (“mlfg6331_64”);兰特(myStream 1 5)
ans = 0.6986 0.7413 0.4239 0.6914 - 0.7255

随机流myStream行为分别从全球流。如果你所说的兰德,randn,兰迪,randperm功能与myStream作为第一个参数,他们从创建的流。如果你叫兰德,randn,兰迪,randperm没有myStream,他们从全球流。

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

RandStream.setGlobalStream RandStream.getGlobalStream (myStream)
ans = mlfg6331_64随机流(当前全球流)种子:0 NormalTransform:金字塔
RandStream.getGlobalStream==myStream
ans = 1

Substreams

您可以使用substreams来得到不同的结果在统计上是独立于一个流。不像种子,沿着随机数序列的位置并不完全知道,substreams之间的间距是已知的,因此可以消除任何重叠的机会。简而言之,substreams是许多相同的控制的方法传统上被用于种子的事情。Substreams也比平行流更轻量级的解决方案。

Substreams提供一个快速和简单的方式,以确保您得到不同的结果在不同的时间相同的代码。使用Substream财产的RandStream对象,创建一个使用生成器,支持substreams流。金宝app的发生器算法列表支持substreams及其属性,表在下一节中看到。金宝app例如,生成一些随机的数字在一个循环中。

myStream = RandStream (“mlfg6331_64”);RandStream.setGlobalStream (myStream)我= 1:5 myStream。Substream =我;z =兰特(我)结束
z z = 0.6986 z = 0.9230 - 0.2489 = 0.0261 0.2530 0.0737 z z = 0.2067 = 0.3220 0.7405 0.1983 0.1052 0.2417 0.9777 0.5970 0.4187

在另一个循环,您可以生成随机值独立于第一组5次迭代。

我= 6:10 myStream。Substream =我;z =兰特(我)结束
z = 0.2650 0.8229 0.2479 0.0247 0.4581 z z = = 0.3963 0.7445 0.7734 0.9113 0.2758 0.3662 0.7979 z z = 0.6814 - 0.5150 = 0.5247

在串行计算Substreams是有用的。Substreams可以再现仿真的全部或部分返回一个特定的检查点在流。例如,您可以返回到6日substream循环。结果如上6日输出包含相同的值。

myStream。Substream=6; z = rand(1,5)
z = 0.2650 0.8229 0.2479 0.0247 0.4581

选择一个随机数字生成器

MATLAB提供了几种发生器算法的选择。表总结了关键属性可用的发生器算法和关键字用于创建它们。返回一个列表的所有可用的发生器算法,使用RandStream.list方法。

关键字 发电机 多个流和Substream支持金宝app 近似的时期完全精确
mt19937ar 梅森素数捻线机(使用默认流在MATLAB启动时) 没有 219937年1
dsfmt19937 SIMD-oriented快速梅森素数捻线机 没有 219937年1
mcg16807 可乘同余发电机 没有 231日2
mlfg6331_64 乘法滞后斐波那契发电机 是的 2124年(251流长度为2的72年)
mrg32k3a 结合多个递归发电机 是的 2191年(263年流长度为2的127年)
philox4x32_10 Philox 4×10轮发电机 是的 2193年(264年流长度为2的129年)
threefry4x64_20 Threefry 4 x64和20轮发电机 是的 2514年(2256年流长度为2的258年)
shr3cong 移位寄存器发电机总结与线性同余发生器 没有 264年
swb2712 修改减去借发电机 没有 21492年

发电机的mcg16807,shr3cong,swb2712与早期版本的MATLAB提供向后兼容性。mt19937ardsfmt19937设计主要是为序贯应用程序。剩下的发电机提供显式支持并行随机数生成。金宝app

根据不同的应用程序,可能会更快一些发电机或返回值更加精确。所有的伪随机数生成器是基于确定性算法,和所有发电机通过一个足够随机性的统计检验。一种检查蒙特卡罗模拟的结果是与两个或两个以上的不同重新运行仿真发生器算法,在MATLAB和发电机的选择提供了手段。虽然不太可能,你的结果会相差超过蒙特卡洛抽样误差时使用不同的发电机,有文学中这种例子验证了特定发生器算法中的缺陷。(见[13]为例)。

发生器算法

mt19937ar

梅森素数捻线机,所述[11]期, 2 19937年 1 和每个U(0,1)值创建使用两个32位的整数。可能的值的倍数 2 53 在区间(0,1)。这个发电机不支持多个流或substreams。金宝app的randn默认情况下使用的算法mt19937ar流梯形金字塔算法[7],但mt19937ar发电机。

请注意

这个发电机是一样使用的兰德函数在MATLAB版本7,激活兰特(捻线机,年代)

dsfmt19937

双精度SIMD-oriented快速梅森素数捻线机,所述[12],是一个梅森素数捻线机的快速实现算法。周期是 2 19937年 1 和可能的值的倍数 2 52 在区间(0,1)。发电机产生双精度值(1、2)本身,它改变了创建U(0,1)值。这个发电机不支持多个流或substreams。金宝app

mcg16807

一个32位的乘法同余发电机,所述[14],乘数 一个 = 7 5 ,模 = 2 31日 1 。这个发电机有一段时间的 2 31日 2 和不支持多个流或subst金宝appreams。创建的每个U(0,1)值是使用一个32位整数的发电机;可能的值的倍数 ( 2 31日 1 ) 1 严格时间间隔内(0,1)。mcg16807流,使用默认的算法randn极地算法(描述[1])。

请注意

这个发电机是一样的在MATLAB版本4的开始使用兰德randn功能,激活使用兰特(种子,年代)randn(种子,年代)

mlfg6331_64

一个64位的乘法滞后斐波那契发电机,所述[10],滞后 l = 63年 , k = 31日 。这个发电机类似于MLFG在受惊包中实现。它有一个大约的时期 2 124年 。它支持金宝app了 2 61年 并行流,通过参数化 2 51 substreams每个长度 2 72年 。创建的每个U(0,1)值是使用一个64位整数的发电机;可能的值的倍数 2 64年 严格时间间隔内(0,1)的randn默认情况下使用的算法mlfg6331_64流梯形金字塔算法[7],但mlfg6331_64发电机。

mrg32k3a

32位组合多个递归发生器,所述[2]。这种发电机类似于CMRG RngStreams包中实现的c的时期 2 191年 和支持金宝app 2 63年 通过序列分割并行流,每个长度 2 127年 。它还支持金宝app 2 51 substreams,每个长度 2 76年 。创建的每个U(0,1)值是使用两个32位整数的发电机;可能的值的倍数 2 53 严格时间间隔内(0,1)的randn默认情况下使用的算法mrg32k3a流梯形金字塔算法[7],但mrg32k3a发电机。

philox4x32_10

4 x32生成器中描述与10轮[15]。这个发电机使用Feistel网络和整数乘法。发电机是高度并行系统中专门为高性能设计如gpu。它有一段2193年(264年流长度为2的129年)。

threefry4x64_20

4 x64发生器与20轮中描述[15]。这个发电机non-cryptographic改编的绞的Threefish块密码哈希函数。它有一段2514年(2256年流长度为2的258年)。

shr3cong

马的SHR3移位寄存器发电机总结与乘数进行线性同余发生器 一个 = 69069年 ,加数 b = 1234567 和模量 2 32 。SHR3 3-shift-register生成器被定义为 u = u ( + l 13 ) ( + R 17 ) ( + l 5 ) ,在那里 标识符, l 左移运算符,R运营商是正确的转变。合并后的发电机(SHR3部分中描述[7])有一个大约的时期 2 64年 。这个发电机不支持多个流或substreams。金宝app创建的每个U(0,1)值是使用一个32位整数的发电机;可能的值的倍数 2 32 严格时间间隔内(0,1)的randn默认情况下使用的算法shr3cong金字形神塔流是早期形式的算法[9],但shr3cong发电机。这个发电机是一样使用的randn函数开始在MATLAB版本5中,激活使用randn(状态,年代)

请注意

SHR3生成器中使用[6](1999)中使用的一个不同[7](2000)。MATLAB使用最新版本的发电机,提出了[7]

swb2712

修改Subtract-with-Borrow生成器中描述[8]。这种发电机类似于一个添加剂滞后斐波那契发电机落后27日和12日,但大约有更长时间的修改 2 1492年 。发电机工作在创建U(0, 1)双精度值,和所有在开区间值(0,1)是可能的。的randn默认情况下使用的算法swb2712流梯形金字塔算法[7],但swb2712发电机。

请注意

这个发电机是一样使用的兰德函数开始在MATLAB版本5中,激活使用兰特(状态,年代)

转换算法

反演

计算正常应用标准正态随机变量的逆累积分布函数统一的随机变量。一个统一的价值是每正常消费价值。

极地

极地拒绝算法中描述[1]。大约1.27均匀值消耗每正常价值,平均。

金字形神塔

梯形金字塔算法,如中描述[7]。大约2.02均匀值消耗每正常价值,平均。

配置一个流

一个随机数流年代属性,控制其行为。访问或改变一个属性,使用语法p = s.Property年代。属性= p

例如,您可以配置转换算法来生成正态分布在使用伪随机值randn。使用默认生成正态分布伪随机值金字形神塔转换算法。

s1 = RandStream (“mt19937ar”);s1.NormalTransform
ans =‘神’
r1 = randn (s1, 1 10);

配置流使用极地转换算法来生成正态分布伪随机值。

s1.NormalTransform=“极地”
s1 = mt19937ar随机流种子:0 NormalTransform:极性的
r2 = randn (s1, 1 10);

当生成随机数的均匀分布兰德,您还可以配置流生成对偶的伪随机值,也就是说,通常值减去1的统一的价值观。

创建6个均匀分布的随机数流。

s2 = RandStream (“mt19937ar”);r1 =兰德(s2, 1, 6)
r1 = 0.8147 0.9058 0.1270 - 0.9134 0.6324 - 0.0975

恢复初始状态的流。创建另一个6的随机数对立的属性设置为true。检查这六个随机数等于前面生成的随机数字减去1。

重置(s2) s2。对立的=true; r2 = rand(s2,1,6)
r2 = 0.1853 0.0942 0.8730 - 0.0866 0.3676 - 0.9025
isequal (r1, r2 1 -)
ans = 1

而不是设置的属性流一个接一个,你可以保存和恢复所有流的性质年代通过使用=得到(s)集(,),分别。例如,配置所有流的属性s2一样的流s1

一个=得到(s1)
=类型:“mt19937ar”NumStreams: 1 StreamIndex: 1 Substream: 1种子:0状态:x1 uint32 [625] NormalTransform:“极地”对立的:0 FullPrecision: 1
设置(s2)
类型:‘mt19937ar NumStreams: 1 StreamIndex: 1 Substream: 1种子:0状态:x1 uint32 [625] NormalTransform:“极地”对立的:0 FullPrecision: 1

得到函数允许您保存和恢复流的整个配置,这样的结果是可再生的。

恢复状态的随机数字生成器繁殖输出

状态属性是随机数发生器的内部状态。您可以保存的状态时全球流在一定程度上模拟产生随机数复制之后的结果。

使用RandStream.getGlobalStream返回一个句柄全球流,也就是说,当前全球流兰德生成随机数。拯救全球流的状态。

globalStream = RandStream.getGlobalStream;myState = globalStream.State;

使用myState,你可以恢复的状态globalStream以前和繁殖的结果。

一个=兰德(1100);globalStream。状态=myState; B = rand(1,100); isequal(A,B)
ans =逻辑1

兰德,兰迪,randn,randperm访问全球流。由于所有这些函数访问相同的底层流,调用一个影响产生的其他后续调用的值。

globalStream。状态=myState; A = rand(1,100); globalStream.State = myState; C = randi(100); B = rand(1,100); isequal(A,B)
ans =逻辑0

您还可以使用流重置到初始设置重置函数。

重置(globalStream) =兰德(1100);重置(globalStream) B =兰德(1100);isequal (A, B)
ans =逻辑1

引用

[1]Devroye, L。非均匀随机变量生成斯普林格出版社,1986年版。

L 'Ecuyer [2], p .“好结合多个递归随机数生成器参数设置”,运筹学47 (1):159 - 164。1999年。

L 'Ecuyer [3], p和s .象牙海岸。“与分裂设施实现随机数包”,ACM交易的数学软件17:98 - 111。1991年。

L 'Ecuyer [4], p, r . Simard。“TestU01: C库随机数生成器的实证测试”ACM交易的数学软件,33(4):22条。2007年。

L 'Ecuyer [5], P。,R。Simard, E. J. Chen, and W. D. Kelton. “An Objected-Oriented Random-Number Package with Many Long Streams and Substreams.”运筹学,(6):1073 - 1075。2002年。

[6]马,g . C的随机数:结束?“Usenet sci.stat.math发布。1999年。可以在网上https://groups.google.com/group/sci.crypt/browse_thread/
线程/ ca8682a4658a124d /

[7]马G。,W. W. Tsang. “The ziggurat method for generating random variables.”杂志的统计软件,5:1-7。2000年。可以在网上https://www.jstatsoft.org/v05/i08

[8]马,G。和a·扎曼。“一类新的随机数生成器”。《应用概率1 (3):462 - 480。1991年。

[9]马,G。,W. W. Tsang. “A fast, easily implemented method for sampling from decreasing or symmetric unimodal density functions.”暹罗j .科学。Stat。第一版。5 (2):349 - 359。1984年。

[10]Mascagni, M。,A. Srinivasan. “Parameterizing Parallel Multiplicative Lagged-Fibonacci Generators.”并行计算30:899 - 916。2004年。

[11]松本,M。,T. Nishimura.“Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudorandom Number Generator.”ACM事务建模和计算机模拟8 (1):3-30。1998年。

[12]松本,M。和m .斋藤。“PRNG专业双精度浮点数使用仿射转换。”2008年蒙特卡洛和Quasi-Monte卡洛方法,10.1007 / 978 - 3 - 642 - 04107 - 5 - _38。2009年。

[13]硅藻土,C.B.与MATLAB数值计算。暹罗,2004年。可以在网上//www.tatmou.com/moler

[14]公园,”栏目,K.W. Miller. “Random Number Generators: Good Ones Are Hard to Find.”ACM的通信31日(10):1192 - 1201。1998年。

[15]鲑鱼,j·K。,M. A. Moraes, R. O. Dror, and D. E. Shaw. "Parallel Random Numbers: As Easy As 1, 2, 3." In学报为高性能计算国际会议,网络,存储和分析(SC11)。纽约,纽约州:ACM, 2011年。

另请参阅

|

相关的话题