主要内容

创建和控制随机数流

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: Ziggurat
RandStream.getGlobalStream==myStream
ans = 1

Substreams

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

子流提供了一种快速和简单的方法来确保您在不同的时间从相同的代码获得不同的结果。使用Substream财产的RandStream对象,使用支持子流的生成器创建流。金宝app有关支持子流及其属性的生成器算法列表,请参见下一节中的表格。金宝app例如,在一个循环中生成几个随机数。

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

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

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

子流在串行计算中很有用。子流可以通过返回到流中的特定检查点来重新创建模拟的全部或部分。例如,您可以返回到循环中的第6个子流。结果包含与上面第6次输出相同的值。

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

选择随机数生成器

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

关键字 发电机 支持多流和子流金宝app 全精度的近似周期
mt19937ar 梅森龙卷风(在MATLAB启动时使用默认流) 没有 2199371
dsfmt19937 面向simd的快速梅森龙卷风 没有 2199371
mcg16807 可乘同余发电机 没有 231-2
mlfg6331_64 乘法滞后的斐波那契生成器 是的 2124(251长度为2的溪流72
mrg32k3a 组合多重递归发生器 是的 2191(263长度为2的溪流127
philox4x32_10 Philox 4x32发电机,10发子弹 是的 2193(264长度为2的溪流129
threefry4x64_20 三联4x64发电机,20发子弹 是的 2514(2256长度为2的溪流258
shr3cong 移位寄存器发生器和线性同余发生器 没有 264
swb2712 用借用生成器修改了减法 没有 21492

发电机的mcg16807shr3cong,swb2712提供与MATLAB早期版本的向后兼容。mt19937ardsfmt19937主要是为顺序应用程序设计的。其余的生成器提供了对并行随机数生成的显式支持。金宝app

根据应用程序的不同,有些生成器可能更快,或者返回值更精确。所有伪随机数生成器都基于确定性算法,所有生成器都通过一个充分具体的随机统计测试。检查蒙特卡洛模拟结果的一种方法是用两个或更多不同的生成器算法重新运行模拟,而MATLAB中生成器的选择为您提供了这样做的方法。尽管当使用不同的生成器时,结果的差异不太可能超过蒙特卡罗抽样误差,但在文献中有这样的例子,这种验证已经在特定的生成器算法中发现了缺陷。(见[13]为例)。

发生器算法

mt19937ar

梅森龙卷风,如[11]期, 2 19937 1 每个U(0,1)值使用两个32位整数创建。可能的值是的倍数 2 53 这个生成器不支持多个流或子流。金宝app的randn默认使用的算法mt19937arStreams是ziggurat算法[7],但与mt19937ar发电机。

请注意

控件使用的生成器与此生成器相同兰德函数开始于MATLAB版本7,激活由兰特(捻线机,年代)

dsfmt19937

双精度simd导向的快速梅森龙卷风,如所述[12],是一个更快的梅森龙卷风算法的实现。周期是 2 19937 1 可能的值是 2 52 在区间(0,1)中。生成器在[1,2)中生成双精度值,将其转换为U(0,1)值。此生成器不支持多流或子流。金宝app

mcg16807

一种32位的乘法同余生成器,如[14],乘数 一个 7 5 ,模 2 31 1 .这个发电机的周期是 2 31 2 且不支持多流或子流。金宝app每个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 .这个生成器类似于在spring包中实现的MLFG。它的周期大约是 2 124 .它支持金宝app到 2 61 并行流,通过参数化,和 2 51 每个长度的子流 2 72 .每个U(0,1)值使用生成器中的一个64位整数创建;可能的值都是 2 64 严格地在区间(0,1)内randn默认使用的算法mlfg6331_64Streams是ziggurat算法[7],但与mlfg6331_64发电机。

mrg32k3a

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

philox4x32_10

一个带有10发子弹的4x32发电机[15].这个生成器使用Feistel网络和整数乘法。该发电机是专门为高性能的高度并行系统,如gpu。周期是2193(264长度为2的溪流129).

threefry4x64_20

一个带有20发子弹的4x64发电机[15].这个生成器是来自Skein Hash函数的threfish块密码的非加密改编。周期是2514(2256长度为2的溪流258).

shr3cong

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

请注意

SHR3发生器用于[6](1999)不同于[7](2000)。MATLAB使用最新版本的生成器,在[7]

swb2712

一种改进的带borrow的减法生成器,如[8].这个生成器类似于滞后27和12的加性滞后斐波那契生成器,但它被修改为大约有一个更长的周期 2 1492 .生成器以双精度工作来创建U(0,1)值,并且开放区间(0,1)中的所有值都是可能的。的randn默认使用的算法swb2712Streams是ziggurat算法[7],但与swb2712发电机。

请注意

控件使用的生成器与此生成器相同兰德函数开始于MATLAB版本5,激活使用兰特(状态,年代)

转换算法

反演

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

极地

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

金字形神塔

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

配置一个流

随机数流年代具有控制其行为的属性。要访问或更改属性,请使用语法p = s.Propertys.Property = p

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

s1 = RandStream (“mt19937ar”);s1。没有rmalTransform
ans =‘神’
r1 = randn (s1, 1 10);

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

s1。没有rmalTransform =“极地”
s1 = mt19937ar随机流种子:0 NormalTransform: Polar
r2 = randn (s1, 1 10);

在生成具有均匀分布的随机数时兰德,您还可以配置流以生成相对的伪随机值,也就是说,统一值从1中减去常用值。

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

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

恢复流的初始状态。创建另外6个随机数字与对立的属性设置为true。检查这6个随机数是否等于前面生成的随机数减去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)
A = Type: 'mt19937ar' NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] NormalTransform: 'Polar' Antithetic: 0 FullPrecision: 1 . NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] NormalTransform: 'Polar' Antithetic: 0 FullPrecision: 1
设置(s2)
类型:'mt19937ar' NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] NormalTransform: 'Polar' Antithetic: 0 FullPrecision: 1 . NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] NormalTransform: 'Polar' Antithetic: 0 FullPrecision: 1

得到函数使您能够保存和恢复流的整个配置,以便在以后精确地再现结果。

恢复状态的随机数生成器复制输出

状态属性是随机数生成器的内部状态。在稍后生成随机数以重新生成结果时,可以在模拟的某个点保存全局流的状态。

使用RandStream.getGlobalStream要返回全局流的句柄,即当前的全局流兰德生成随机数。保存全局流的状态。

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

使用myState,可以恢复状态globalStream并重现之前的结果。

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

兰德兰迪randn,randperm访问全局流。由于所有这些函数访问相同的底层流,因此对其中一个函数的调用会在后续调用中影响其他函数生成的值。

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

属性将流重置为初始设置重置函数。

重置(globalStream) A = rand(1100);重置(globalStream) B = rand(1100);isequal (A, B)
逻辑1

参考文献

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

《组合多重递归随机数生成器的良好参数集》,运筹学47(1): 159 - 164。1999.

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

P. L'Ecuyer和R. Simard。《TestU01: A C Library for Empirical Testing of Random Number Generators》数学软件学报第33(4)条:2007.

L’ecuyer, P., R. Simard, E. J. Chen, W. D. Kelton。一个具有许多长流和子流的面向对象的随机数包。运筹学,(6): 1073 - 1075。2002.

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

Marsaglia G.和w.w. Tsang。"产生随机变量的金字形方法"统计软件杂志, 5:1-7。2000.可以在网上https://www.jstatsoft.org/v05/i08

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

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

Mascagni, M.和A. Srinivasan。并行乘性滞后斐波那契生成器的参数化并行计算30: 899 - 916。2004.

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

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

[13]硅藻土,C.B.MATLAB的数值计算.暹罗,2004年。可以在网上//www.tatmou.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。

另请参阅

|

相关的话题