主要内容

控制随机数生成

的用法rng函数,它提供对随机数生成的控制。

(伪)随机数在MATLAB®来自兰德兰迪,randn功能。许多其他函数调用这三个函数,但它们是基本的构建模块。这三个都依赖于单个共享随机数生成器,您可以使用该生成器进行控制rng

重要的是要认识到MATLAB中的“随机”数根本不是不可预测的,而是由确定性算法生成的。该算法设计得足够复杂,使其输出出现对于不知道算法的人来说是一个独立的随机序列,并且可以通过各种随机性的统计检验。这里介绍的函数提供了利用决定论的方法

  • 重复包含随机数的计算,并得到相同的结果,或者

  • 保证在重复计算中使用不同的随机数

并利用明显的随机性来证明将不同计算的结果结合在一起是合理的。

“重新开始”

如果你看一下输出兰德兰迪,或randn在一个新的MATLAB会话中,你会注意到它们每次重新启动MATLAB时返回相同的数字序列。它通常是有用的,能够重置随机数生成器到启动状态,而不实际重新启动MATLAB。例如,您可能想要重复涉及随机数的计算,并得到相同的结果。

rng提供一种非常简单的方法将随机数生成器恢复到默认设置。

rng默认的兰德%返回与启动时相同的值
ans = 0.8147

MATLAB启动时的“默认”随机数设置是什么rng违约给你吗?如果你叫rng在没有输入的情况下,您可以看到它是梅森Twister生成器算法,种子为0。

rng
ans =结构体字段:类型:'twister'种子:0状态:[625x1 uint32]

下面将详细介绍如何使用上面的输出,包括状态字段,来控制和改变MATLAB生成随机数的方式。目前,它只是作为一种查看生成器的方法兰德兰迪,randn目前使用。

Non-Repeatability

每次你打来电话兰德兰迪,或randn,它们从共享随机数生成器中提取一个新值,连续的值可以被视为统计上独立的。但如上所述,每次重新启动MATLAB时,这些函数都会重置,并返回相同的数字序列。显然,使用相同“随机”数字不能被认为是统计上独立的。所以当需要合并两个或多个MATLAB会话中的计算时,就好像它们统计独立,您不能使用默认的生成器设置。

避免在新的MATLAB会话中重复相同随机数的一个简单方法是为随机数生成器选择不同的种子。rng通过基于当前时间创建种子,为您提供了一种简单的方法。

rng洗牌兰德
ans = 0.2536

每次你使用“洗牌”,它就会用不同的种子重新播种发电机。你可以叫rng没有输入来查看它实际使用的种子。

rng
ans =结构体字段:类型:'twister'种子:600797869状态:[625x1 uint32]
rng洗牌%每次创建一个不同的种子rng
ans =结构体字段:类型:'twister'种子:600797874状态:[625x1 uint32]
兰德
ans = 0.5441

“洗牌”是一个非常简单的方法来重新种子随机数生成器。您可能认为使用它在MATLAB中获得“真正的”随机性是一个好主意,甚至是必要的。不过,在大多数情况下,没有必要使用“洗牌”在所有.根据当前时间选择种子不会改善您将从中获得的值的统计属性兰德兰迪,randn,这并没有使它们在任何真正意义上“更随机”。虽然在每次启动MATLAB时,或者在运行涉及随机数的大型计算之前,都可以重新填充生成器,但在会话中过于频繁地填充生成器实际上不是一个好主意,因为这可能会影响随机数的统计属性。

什么“洗牌”是一种避免重复相同值序列的方法。有时这很重要,有时只是“不错”,但通常这一点都不重要。记住,如果你使用“洗牌”,你可能想要保存种子rng这样以后就可以重复计算了。您将在下面看到如何做到这一点。

对重复性和非重复性的更多控制

到目前为止,您已经了解了如何将随机数生成器重置为默认设置,并使用使用当前时间创建的种子对其进行重新播种。rng还提供了使用特定种子重新播种的方法。

您可以多次使用相同的种子,以重复相同的计算。例如,如果你运行这段代码两次…

rng (1)%种子是任何< 2^32的非负整数x = randn(1、5)
x =1×5-0.6490 1.1812 -0.7585 -1.1096 -0.8456
Rng (1) x = randn(1,5)
x =1×5-0.6490 1.1812 -0.7585 -1.1096 -0.8456

...你会得到完全相同的结果。你可以这样做来重建x在清除它之后,以便您可以重复在依赖于的后续计算中所发生的事情x,使用这些特定的值。

另一方面,你可以选择不同的种子,以确保您不会重复相同的计算。例如,如果你在一个MATLAB会话中运行这段代码…

Rng (2) x2 = sum(randn(50,1000),1);% 1000次随机游走试验

而这段代码在另一个…

Rng (3) x3 = sum(randn(50,1000),1);

...您可以将这两个结果结合起来,并确信它们不是重复两次的相同结果。

X = [x2 x3];

“洗牌”有一个警告,当重新播种MATLAB的随机数生成器,因为它影响所有后续的输出兰德兰迪,randn.除非需要可重复性或唯一性,否则通常建议只生成随机值而不重新播种生成器。如果您确实需要重新为生成器添加种子,通常最好在命令行中完成,或者在代码中不易被忽略的位置完成。

选择发电机类型

您不仅可以像上面所示的那样重新生成随机数生成器,还可以选择您想要使用的随机数生成器的类型。不同的生成器类型产生不同的随机数序列,例如,您可以根据其统计属性选择特定的类型。或者您可能需要从使用不同默认生成器类型的较老版本的MATLAB中重新创建结果。

选择生成器类型的另一个常见原因是,您正在编写一个生成“随机”输入数据的验证测试,并且您需要保证您的测试总是能够期望完全相同的可预测结果。如果你叫rng在创建输入数据之前使用种子,它将对随机数生成器进行重新种子。但如果由于某种原因而更改了生成器类型,则从的输出兰德兰迪,randn不会像你期望的那样。因此,为了100%确定可重复性,还可以指定生成器类型。

例如,

rng (0,“旋风”

原因兰德兰迪,randn使用梅森龙卷风生成器算法,在它播种0。

使用“combRecursive”

rng (0,“combRecursive”

选择组合多递归生成器算法,该算法支持一些梅森扭扭器不支持的并行特性。

这个命令

rng (0,v4的

选择MATLAB 4.0中默认的生成器算法。

当然,该命令将随机数生成器返回到默认设置。

rng默认的

但是,由于默认的随机数生成器设置可能在MATLAB版本之间更改,使用“默认”并不能保证长期可预测的结果。“默认”是重置随机数生成器的一种方便方法,但为了获得更多的可预测性,请指定生成器类型和种子。

另一方面,当您进行交互工作并需要可重复性时,调用更简单,通常也足够了rng只是一颗种子。

保存和恢复随机数生成器设置

调用rng如果没有输入,则返回一个标量结构,该结构的字段包含两个已经描述过的信息:生成器类型和生成器最后重新播种时使用的整数。

s = rng
s =结构体字段:类型:'twister'种子:0状态:[625x1 uint32]

第三个字段,状态,包含生成器当前状态向量的副本。这个状态向量是生成器内部维护的信息,以便在其随机数序列中生成下一个值。每次你打来电话兰德兰迪,或randn,它们共享的生成器更新其内部状态。返回的设置结构中的状态向量rng包含从捕获状态的点开始重复序列所需的信息。

虽然能够看到这个输出是有信息的,rng也接受设置结构作为输入,以便您可以保存设置,包括状态向量,并在稍后恢复它们以重复计算。因为设置包含生成器类型,您将确切地知道您将得到什么,所以“稍后”可能意味着从同一MATLAB会话中的稍后片刻,到多年(和多个MATLAB版本)之后的任何事情。您可以从保存生成器设置的随机数序列中的任意点重复结果。例如

x1 = randn (10,10);%在随机数序列中向前移动s =提高;%此时保存设置x2 = randn(1、5)
x2 =1×50.8404 -0.8880 0.1001 -0.5445 0.3035
x3 = randn (5,5);%在随机数序列中向前移动rng(年代);%将生成器返回到保存的状态x2 = randn(1、5)重复同样的数字
x2 =1×50.8404 -0.8880 0.1001 -0.5445 0.3035

注意,虽然重新播种只提供了粗略的重新初始化,但是使用settings结构保存和恢复生成器状态可以重复进行任何随机数序列的一部分。

使用设置结构最常见的方法是恢复生成器状态。但是,由于该结构不仅包含状态,还包含生成器类型和种子,因此它也是临时切换生成器类型的方便方法。例如,如果您需要使用MATLAB 5.0中的一个遗留生成器来创建值,您可以在切换到使用旧生成器的同时保存当前设置……

previousSettings = rng (0,“v5uniform”
previousSettings =结构体字段:类型:'twister'种子:0状态:[625x1 uint32]

...然后恢复原来的设置。

rng (previousSettings)

您不应该修改设置结构中任何字段的内容。特别是,您不应该构造自己的状态向量,甚至不应该依赖于生成器状态的格式。

编写更简单、更灵活的代码

rng允许你

  • 重新输入随机数生成器,或者

  • 保存并恢复随机数生成器设置

不需要知道它是什么类型。您还可以将随机数生成器返回到默认设置,而不需要知道这些设置是什么。虽然在某些情况下你可能会想要要指定生成器类型,rng让你的生活简单来指定它。

如果您能够避免指定生成器类型,那么您的代码将自动适应需要使用不同生成器的情况,并将自动受益于新的默认随机数生成器类型中改进的属性。

rng而且RandStream

rng为MATLAB中最常见的随机数生成控制提供了一种方便的方法。然而,涉及多个随机数流和并行随机数生成的更复杂的情况需要更复杂的工具。的RandStream类就是这个工具,它提供了控制随机数生成的最强大的方法。这两个工具是互补的rng的灵活性之上构建了一个更简单和简洁的语法RandStream

Baidu
map