主要内容

控制随机数的产生

此示例显示了如何使用rng函数,它提供对随机数生成的控制。

matlab中的(伪)随机数来自兰特兰迪,兰德功能。许多其他函数都会调用这三个函数,但它们是基本的构建块。这三个都依赖于您可以使用的单个共享随机数生成器rng

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

  • 重复涉及随机数的计算,并获得相同的结果,或

  • 保证不同的随机号被重复计算使用

并利用明显的随机性来证明从单独计算中得出的结果的合理性。

“重新开始”

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

rng提供了一种非常简单的方法来将随机数生成器返回其默认设置。

rng默认兰特%返回与启动时相同的值
ANS = 0.8147.

MATLAB启动的“默认”随机数设置是什么,或者rng违约给你?如果你打电话rng没有输入,你可以看到它是Mersenne Twister发生器算法,播种为0。

rng
ans =.结构与字段:类型: '绕口令' 种子:0状态:625x1 UINT32]

你会更详细见下文如何使用上面的输出,包括状态现场,以控制和改变如何MATLAB产生随机数。现在,它作为一种方法,看看有什么发生器兰特兰迪,兰德目前使用。

非重复性

每次打电话兰特兰迪, 或者兰德,它们从共享随机数生成器中汲取新值,并且连续值可以被视为统计上独立的。但如上所述,每次重新启动MATLAB时,这些功能都被重置并返回相同的数字序列。显然,计算使用的计算相同的“随机”号码不能被认为是统计独立。所以,当有必要在两个或两个以上MATLAB会话仿佛做过测算,他们结合统计上独立,您无法使用默认的生成器设置。

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

rng洗牌兰特
ANS = 0.3862

每次使用'洗牌',它重播具有不同的种子发电机。您可以拨打rng没有投入,看看它的种子实际使用。

rng
ans =.结构与字段:类型:'Twister'种子:113297371状态:[625x1 UINT32]
rng洗牌%每次都会产生不同的种子rng
ans =.结构与字段:类型:'twister' Seed: 113297379 State: [625x1 uint32]
兰特
ans = 0.6415.

'洗牌'是补种的随机数生成一个非常简单的方法。你可能会认为这是一个好主意,甚至是必要的,用它来获得MATLAB“真正的”随机性。在大多数情况下,虽然,这是没有必要使用'洗牌'在所有。根据当前时间选择种子不会改善您从中获得的值的统计特性兰特兰迪,兰德,并没有任何真正意义上让他们“更随机”。虽然这是完全正常的,每次补种发电机您启动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 = Rng (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的随机数生成器,因为它影响所有后续输出兰特兰迪,兰德。除非你需要重复性或独特性,它通常是最好简单地生成随机值,而无需再接种发电机。如果你确实需要补种发电机,即通常最好在命令行中完成的,或者在你的代码是不容易忽视的地方。

选择一个发电机类型

您不仅可以将随机数发生器重置如上所示,您还可以选择要使用的随机数生成器的类型。不同的发电机类型产生不同的随机数序列,例如,由于其统计属性,您可以选择特定类型。或者您可能需要通过使用不同的默认生成器类型的旧版MATLAB重新创建结果。

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

例如,

RNG(0,'twister'

原因兰特兰迪,兰德使用Mersenne Twister发生器算法,将其播种为0。

使用'combRecursive'

RNG(0,'combRecursive'

选择组合多重递归生成器算法,它支持梅森龙卷风不支持的一些并行特性。金宝app

这个命令

RNG(0,v4的

选择生成算法,在MATLAB 4.0的默认设置。

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

rng默认

然而,由于默认随机数生成器设置可能会在MATLAB版本之间改变,使用“默认”不保证在长期预测的结果。“默认”是重置随机数发生器的便捷方式,但是对于更高的可预测性,请指定发电机类型和种子。

另一方面,当您以交互方式工作并需要重复性时,它更简单,通常就足够了rng只是一个种子。

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

打电话rng在没有输入的返回与包含已经描述的两条信息字段标量结构:发电机类型,以及与该发电机最后再接种的整数。

s = RNG.
s =结构与字段:类型: '绕口令' 种子:0状态:625x1 UINT32]

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

虽然能够看到这个输出是很有用的,rng也接受设置结构作为输入,这样就可以保存设置,包括状态向量,并在以后恢复他们的重复计算。由于设置包含发电机的类型,你就知道你会得到什么,所以“后来的”稍后可能意味着从后又在同一MATLAB会话的时刻什么,多年(与多个MATLAB版本)。您可以在其中保存生成器设置随机数序列的任何点重复的结果。例如

X1 = randn(10,10);%以随机数序列前进s = RNG;%此时保存设置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

请注意,虽然重新确定仅提供粗糙的重新初始化,但使用设置结构保存和恢复生成状态允许您重复任何随机数序列的一部分。

使用设置结构最常见的方式是恢复发电机状态。然而,由于该结构不仅包含了状态,而且发电机类型和种子,这也是一个方便的方法来暂时切换类型的发电机。例如,如果你需要创建使用传统发电机的一个从MATLAB 5.0的值,可以在同一时间,你切换到使用旧发电机保存当前设置...

previousSettings = rng (0,'v5uniform'
以前的思考=结构与字段:类型: '绕口令' 种子:0状态:625x1 UINT32]

...然后稍后还原原始设置。

RNG(以前的例)

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

写作更简单,更灵活,代码

rng允许你

  • 重新填充随机数生成器,或者

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

不需要知道它是什么类型的。您还可以将随机数生成器返回到其默认设置,而不需要知道这些设置是什么。但有些情况下你可能会要指定生成器类型,rng为你提供简单的拥有指定它。

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

rngrandstream.

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