主要内容

创建和控制随机数流

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

您可以使用子流来获得不同的结果,这些结果在统计上独立于流。与种子不同的是,种子沿着随机数序列的位置是未知的,子序列之间的间隔是已知的,所以任何重叠的机会都可以消除。简而言之,子流程是一种更受控制的方式,可以做许多传统上使用种子的事情。子流也是一种比并行流更轻量级的解决方案。

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

myStream = RandStream(“mlfg6331_64”);RandStream.setGlobalStream (myStream)i = 1:5 myStream。Substream = i;Z = rand(1,i)结束
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 = i;Z = rand(1,11-i)结束
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方法。

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

发电机的mcg16807shr3cong,swb2712提供与早期版本的MATLAB的向后兼容性。mt19937ardsfmt19937主要为顺序应用而设计。其余的生成器为并行随机数生成提供显式支持。万博1manbetx

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

发生器算法

mt19937ar

Mersenne Twister,在[11],有周期 2 19937 1 每个U(0,1)值都是使用两个32位整数创建的。可能的值是的倍数 2 53 此生成器不支持多个流或子流。万博1manbetx的randn默认使用算法mt19937arStreams是ziggurat算法[7],但是mt19937ar发电机。

请注意

这台发电机与英国政府使用的发电机相同兰德函数开始于MATLAB Version 7,由激活兰特(捻线机,年代)

dsfmt19937

双精度simd导向的快速梅森捻线机,如所述[12],是一个更快的实现梅森扭转算法。周期是 2 19937 1 可能的值是 2 52 在区间(0,1)内。生成器在[1,2)中本地产生双精度值,这些值被转换为创建U(0,1)值。此生成器不支持多个流或子流。万博1manbetx

mcg16807

一个32位乘法同余生成器,如[14],乘数 一个 7 5 ,模 2 31 1 。这个发生器的周期是 2 31 2 并且不支持多个流或子流。万博1manbetx每个U(0,1)值都是使用来自生成器的单个32位整数创建的;可能的值都是的倍数 2 31 1 1 严格在区间(0,1)内mcg16807的默认算法randn极坐标算法(描述在[1])。

请注意

该生成器与MATLAB Version 4中开始使用的生成器相同兰德randn功能,使用兰特(种子,年代)randn(种子,年代)

mlfg6331_64

一个64位乘法滞后斐波那契生成器,如[10],有滞后 l 63 k 31 。这个生成器类似于SPRNG包中实现的MLFG。它的周期大约是 2 124 。它支持万博1manbetx 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 并支持到万博1manbetx 2 63 并行流通过序列分裂,每个长度 2 127 。它还支持万博1manbetx 2 51 子流,每个长度 2 76 。每个U(0,1)值都是使用生成器中的两个32位整数创建的;可能的值是的倍数 2 53 严格在区间(0,1)内randn默认使用算法mrg32k3aStreams是ziggurat算法[7],但是mrg32k3a发电机。

philox4x32_10

一个4 × 32发电机,有10发子弹,如所述[15]。这个生成器使用Feistel网络和整数乘法。该生成器专为gpu等高度并行系统的高性能而设计。它的周期是2193(264长度为2的流129)。

threefry4x64_20

有20发子弹的4x64发电机[15]。该生成器是Skein哈希函数的Threefish块密码的非加密改编。它的周期是2514(2256长度为2的流258)。

shr3cong

Marsaglia的SHR3移位寄存器发生器与带乘法器的线性同余发生器求和 一个 69069 ,加数 b 1234567 ,模数 2 32 。SHR3是一个3移位寄存器生成器,定义为 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 Version 5开始,激活使用randn(状态,年代)

请注意

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

swb2712

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

请注意

这台发电机与英国政府使用的发电机相同兰德函数从MATLAB Version 5开始,激活使用兰特(状态,年代)

转换算法

反演

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

极地

极性抑制算法,如[1]。平均每个正常值消耗约1.27个均匀值。

金字形神塔

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

配置流

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

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

s1 = RandStream()“mt19937ar”);s1。没有rmalTransform
ans = 'Ziggurat'
R1 = randn(s1,1,10);

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

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

生成均匀分布的随机数时使用兰德,您还可以配置流来生成对立的伪随机值,也就是说,通常的值从1中减去一致的值。

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

s2 = RandStream()“mt19937ar”);R1 = rand(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
等于(r1,1 - r2)
Ans = 1

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

A = get(s1)
A = Type: 'mt19937ar' 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

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

恢复随机数生成器的状态以再现输出

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

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

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

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

A = rand(1,100);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

方法将流重置为初始设置重置函数。

reset(globalStream) = rand(1,100);reset(globalStream) = rand(1,100);isequal (A, B)
Ans =逻辑1

参考文献

戴维耶,L。非均匀随机变量生成,斯普林格出版社,1986。

[10] L 'Ecuyer, P.“组合多个递归随机数发生器的良好参数集”,运筹学生态学报,47(1):159-164。1999.

[3] L'Ecuyer, P. and S. Côté。《实现具有拆分功能的随机数包》,ACM数学软件汇刊, 17: 98-111。1991.

[b] L'Ecuyer, P.和R. Simard。“TestU01:一个用于随机数生成器实证测试的C库,”ACM数学软件汇刊, 33(4):第22条。2007.

[10]刘永强,陈志强,陈志强。一个具有许多长流和子流的面向对象随机数包。运筹学,(6): 1073 - 1075。2002.

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

[10]马淑丽,曾伟伟。"生成随机变量的ziggurat方法"统计软件杂志, 5:1-7。2000.可在以下网址下载https://www.jstatsoft.org/v05/i08

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

bbbba Marsaglia, G.和w.w.w。从递减或对称单峰密度函数中进行采样的一种快速、容易实现的方法。SIAM J. Sci。Stat。第一版。5(2): 349 - 359。1984.

M. Mascagni和A. Srinivasan。参数化并行乘法滞后斐波那契生成器。并行计算中文信息学报,30:899-916。2004.

[b] M.松本,T.西村。梅森扭扭器:一种623维均匀分布的均匀伪随机数发生器。美国计算机学会建模与计算机仿真汇刊8(1): 3-30。1998.

[qh]松本,M.,齐藤。使用仿射转换的专用于双精度浮点数的PRNG。蒙特卡罗和拟蒙特卡罗方法2008, 10.1007 / 978 - 3 - 642 - 04107 - 5 - _38。2009.

b . b .莫勒MATLAB数值计算。暹罗,2004年。可在以下网址下载//www.tianjin-qmedu.com/moler

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

[15] Salmon, J. K., M. A. Moraes, R. O. Dror, D. E. Shaw。“平行随机数:像1,2,3一样简单。”在高性能计算、网络、存储和分析国际会议论文集(SC11)。纽约:ACM, 2011。

另请参阅

|

相关的话题