本文讲述了如何使用 rng 函数,该函数针对随机数的生成提供控制。

MATLAB 中的(伪)随机数通过 rand、randi 和 randn 函数生成。许多其他函数调用这三个函数,但这三个函数是基础构建块。这三个函数都依赖于一个共享的随机数生成器,可以使用 rng 控制该生成器。

务必注意,MATLAB 中的“随机”数并非是完全不可预测的,而是由确定的算法生成的。该算法设计得极为复杂,这样一来,对不了解该算法的人来说,其输出似乎为独立的随机序列,并且可以通过各种随机性的统计学测试。这里介绍的函数提供了相应方式来利用确定性执行以下操作:

重复进行涉及随机数的计算,并获取相同结果,或者

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

以及利用明显的随机性来证明不同计算的合并结果。

从头开始

如果在新 MATLAB 会话中查看 rand、randi 或 randn 的输出,可注意到,每次重新启动 MATLAB 时,这些函数都返回相同的数字序列。能够将随机数生成器重置到启动状态而实际上并不重新启动 MATLAB,通常很有用。例如,您可能需要重复进行涉及随机数的计算并获取相同结果。

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

rng default
rand
ans = 0.8147

MATLAB 启动时使用的或 rng default 为您提供的“默认”随机数设置是什么?如果调用不带任何输入的 rng,可以看到,该设置是种子为 0 的梅森旋转生成器算法。

rng
ans = struct with fields:Type: 'twister'Seed: 0State: [625x1 uint32]

下面详细介绍了如何使用上述输出(包括 State 字段)来控制和更改 MATLAB 生成随机数的方式。在上文中,该示例提供了一种方法来查看生成器 rand、randi 和 randn 当前使用的设置。

非重复性

每次调用 rand、randi 或 randn 时,它们都会从其共享的随机数生成器获取一个新值,后续值可被视为在统计上独立的值。但是如上所述,每次重新启动 MATLAB 时,这些函数都将会被重置并返回相同的数字序列。很明显,使用相同“随机”数进行的计算不能认为是与统计无关的。因此,如果需要合并在两个或更多个 MATLAB 会话中完成的计算,则无法使用默认生成器设置。

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

rng shuffle
rand
ans = 0.2529

每次使用 ‘shuffle’ 时,都将为生成器提供一个不同的种子。可以调用不带任何输入的 rng 来查看实际所使用的种子。

rng
ans = struct with fields:Type: 'twister'Seed: 500248742State: [625x1 uint32]rng shuffle % creates a different seed each time
rng
ans = struct with fields:Type: 'twister'Seed: 500248747State: [625x1 uint32]rand
ans = 0.9194

‘shuffle’ 是为随机数生成器重新提供种子的一种简单方式。您可能认为,使用它在 MATLAB 中实现“真正的”随机性是个好主意,甚至是必要的。但在大多数场合下,完全无需使用 ‘shuffle’。基于当前时间选择种子并不会改善从 rand、randi 和 randn 获取的值的统计属性,也不会在任何意义上提高这些值的随机性。虽然最好在每次启动 MATLAB 时,或者在运行某种涉及随机数的大型计算之前,都为生成器重新提供种子,但实际上在会话中过于频繁地为生成器重新提供种子并不是一种恰当之举,因为这可能会影响随机数的统计学属性。

‘shuffle’ 真正提供的是一种避免重复相同值序列的方法。有时它很关键,有时仅是“不错”,但通常完全无非紧要。请记住,如果使用 ‘shuffle’,您可能需要保存 rng 创建的种子,以便在以后重复您的计算。下面说明了如何执行该操作。

进一步控制重复性和非重复性

到此为止,您已了解了如何将随机数生成器重置为其默认设置,以及使用基于当前时间创建的种子为其重新提供种子。rng 还提供了一种使用特定种子来为随机数生成器重新提供种子的方法。

您可以多次使用相同的种子来重复进行相同的计算。例如,如果运行下面的代码两次…

rng(1) % the seed is any non-negative integer < 2^32
x = randn(1,5)
x = 1×5-0.6490    1.1812   -0.7585   -1.1096   -0.8456rng(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 trials of a random walk

并在另一个会话中运行下面的代码…

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

…可以合并两个结果,并确信它们不是重复两次的相同结果。

x = [x2 x3];

与 ‘shuffle’ 一样,当为 MATLAB 的随机数生成器重新提供种子时将会出现警告,因为这会影响 rand、randi 和 randn 的所有后续输出。除非需要重复性或唯一性,否则通常建议不要简单通过重新为生成器提供种子来生成随机值。如果的确需要为生成器重新提供种子,通常最好在命令行或代码中不易忽略的某个点上完成。

选择生成器类型

不仅可以按如上所述为随机数生成器重新提供种子,还可以选择要使用的随机数生成器的类型。不同的生成器类型会产生不同的随机数序列,例如,可以因为其统计学属性而选择特定的类型。或者,可能需要从使用不同默认生成器类型的旧版 MATLAB 重新创建结果。

选择生成器类型的另一个常见原因是,您要编写用于生成“随机”输入数据的验证测试,并需要保证测试始终可以得到完全相同的可预测结果。如果在创建输入数据之前调用带种子的 rng,这将为随机数生成器重新提供种子。但如果由于某原因更改了生成器类型,则 rand、randi 和 randn 的输出将不会是您期望通过该种子得到的。因此,要 100% 确保可重复性,也可以指定生成器类型。

例如,

rng(0,'twister')

令 rand、randi 和 randn 采用种子 0 且使用梅森旋转生成器算法。

使用 ‘combRecursive’

rng(0,'combRecursive')

选择组合多递归生成器算法,该算法支持梅森旋转不支持的某些并行功能。

以下命令

rng(0,'v4')

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

当然,此命令会将随机数生成器恢复为其默认设置。

rng default
但是,由于不同 MATLAB 版本的默认随机数生成器设置可能发生更改,因此使用 ‘default’ 并不能长期保证得到可预测的结果。‘default’ 是重置随机数生成器的一种便利方式,但要实现更好的可预测性,请指定生成器类型和种子。

另一方面,在执行交互式工作并且需要可重复性时,调用只带一个种子的 rng 不仅更简单,而且通常足够满足要求。

保存并还原随机数生成器的设置

调用不带任何输入的 rng 将返回一个标量结构体,其中的字段包含已说明的两条信息:生成器类型和上次为生成器重新提供种子所用的整数。

s = rng
s = struct with fields:Type: 'twister'Seed: 0State: [625x1 uint32]

第三个字段 State 包含生成器的当前状态向量的副本。此状态向量是生成器在内部维护以便在其随机数序列中生成下一个值的信息。每次调用 rand、randi 或 randn 时,它们共享的生成器都会更新其内部状态。因此,rng 返回的设置结构体中的状态向量包含从捕获状态的时间点开始重复该序列所需的信息。

虽然可以看到此输出为信息性内容,但 rng 也接受设置结构体作为“输入”,以便保存设置并在以后还原它们以重复计算。因为设置包含生成器类型,所以可以确切知道将得到的结果,这样“以后”在同一 MATLAB 会话中可能意味着从稍后的某个时刻到以后的几年。您可以在随机数序列中从保存生成器设置的任何点重复结果。例如

x1 = randn(10,10);
s = rng;
x2 = randn(1,5)
x2 = 1×50.8404   -0.8880    0.1001   -0.5445    0.3035x3 = randn(5,5);
rng(s);
x2 = randn(1,5)
x2 = 1×50.8404   -0.8880    0.1001   -0.5445    0.3035

请注意,虽然重新提供种子仅提供粗略的重新初始化,但使用结构体保存和还原生成器状态,可以重复随机数序列的任意部分。

使用设置结构体的最常见方式是还原生成器状态。但是,由于结构体不仅包含状态,还包含生成器类型和种子,因此临时切换生成器类型也是一种方便的方式。例如,如果需要使用 MATLAB 5.0 中的某个旧生成器创建值,则可以在切换为使用旧生成器的同时保存当前设置…

previousSettings = rng(0,'v5uniform')
previousSettings = struct with fields:Type: 'twister'Seed: 0State: [625x1 uint32]

…然后在以后还原原始设置。

rng(previousSettings)

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

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

通过 rng,可以

为随机数生成器重新提供种子,或者

保存并还原随机数生成器设置

而无需了解其是什么类型。您也可以将随机数生成器恢复为其默认设置,而无需了解这些设置是什么。rng 虽然存在可能需要指定生成器类型的情况,但指定生成器类型不是必需的,因而可简化您的操作。。

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

rng 和 RandStream

rng 提供了一种便捷的方式来控制 MATLAB 中的随机数生成,以满足大多数常见的需求。但是,涉及多个随机数流和并行随机数生成的更复杂情况需要更复杂的工具。RandStream 类即是满足该需要的工具,它提供了最强大的方式来控制随机数生成。这两个工具相互补充,其中 rng 基于 RandStream 的灵活性而构建,可提供更简单和更精炼的语法。

MATLAB 数学应用 随机数生成 控制随机数的生成相关推荐

  1. MATLAB 数学应用 随机数生成 创建和控制随机数流

    通过 RandStream 类,可以创建随机数流.在很多情况下,这是很有用的: 可以生成随机值,而不影响全局流的状态. 可以在仿真中分离随机性的来源. 使用的生成器可以与 MATLAB® 软件在启动时 ...

  2. [Matlab]概率论与数理统计:随机数的生成与应用

    先来给大家介绍一下Matlab的统计工具箱:Statistics Toolbox.能广泛支持统计计算任务. 下面介绍一些基本的随机数生成函数: 分布类型 函数名称 调用格式 二项分布 binornd ...

  3. java 随机数生成算法_Java随机数的生成算法

    Java中随机数的生成算法主要有3种 1.Math.random()//产生一个0-1之间的随机数,类型为double类型 2.new Random() random.nextInextInt(100 ...

  4. 直扩 单音干扰抑制 matlab,数学计算软件MATLAB资料集锦分享

    数学计算软件MATLAB资料集锦分享 (2014-08-20 17:07:08) 标签: matlab 数学建模 仿真模拟 整理了一些有关MATLAB资料如下: 1.H型可逆PWM变换器的控制方式解析 ...

  5. java生成指数分布随机数_生成特定分布随机数的方法

    生成随机数是程序设计里常见的需求.一般的编程语言都会自带一个随机数生成函数,用于生成服从均匀分布的随机数.不过有时需要生成服从其它分布的随机数,例如高斯分布或指数分布等.有些编程语言已经有比较完善的实 ...

  6. random库:Python随机数的生成与应用

    目录 前言 生成随机数 种子 random.sample 随机元素 SystemRandom 非均匀分布 正态分布 近似分布 前言 在实际的开发中,经常会用到随机数生成.而random库专用于随机数的 ...

  7. C语言经典小游戏---猜数字游戏 (包含C语言中如何实现随机数的生成)

    题目描述:输入1-100之间的数字,进行猜数字游戏,猜大猜小有提示,直至才对为止,游戏可以重复游玩. 算法思路: 1.用void函数分别写出菜单程序与游戏进程程序. 2.用switch-case-de ...

  8. 《机器人与数字人:基于MATLAB的建模与控制》——2.3节指数映射和k过程

    本节书摘来自华章社区<机器人与数字人:基于MATLAB的建模与控制>一书中的第2章,第2.3节指数映射和k过程,作者[美]顾友谅(Edward Y.L.Gu),更多章节内容可以访问云栖社区 ...

  9. 《机器人与数字人:基于MATLAB的建模与控制》——2.2节李群和李代数

    本节书摘来自华章社区<机器人与数字人:基于MATLAB的建模与控制>一书中的第2章,第2.2节李群和李代数,作者[美]顾友谅(Edward Y.L.Gu),更多章节内容可以访问云栖社区&q ...

最新文章

  1. Quartz 2D Programming Guide笔记
  2. CVPR2020 Oral | 港中文-商汤等开源:自监督场景去遮挡
  3. Java基础之Switch语句
  4. java调用 火眼臻睛,连接创新,发现未来,臻识科技受邀CCF-GAIR,论道浪潮之巅...
  5. html无限添加元素,jquery--html【添加元素】
  6. 组合数学-- 放回取样基础公式证明
  7. c++中的运算符重载---知识点:运算符重载函数,友元函数,函数重载
  8. 庆祝一下博文过100篇访问量过30万
  9. 编译Android4.3内核源代码
  10. 网络空间安全要学c语言吗,网络空间安全科学与技术(英文)杂志投稿-专门发布期刊官方征稿信息-万维书刊网...
  11. 销售订单(SO)-API-给已有的销售订单增加一行
  12. 【图像融合】基于matlab小波变换图像融合【含Matlab源码 392期】
  13. 腾讯安全发布远程桌面服务高危漏洞(CVE-2019-1181 / 1182)修复工具
  14. 使用VLC把视频转换为一帧一帧的图片
  15. Koo叔说Shader—最基本的Shader
  16. 南卡租房之Park Circle
  17. 混沌图像加密matlab,基于复合混沌系统的彩色图像加密算法及Matlab实现
  18. 【前端换肤】前端换肤方案
  19. k线图基础知识图解——单根K线的含义
  20. R语言︱SNA-社会关系网络—igraph包(中心度、中心势)(二)

热门文章

  1. Java树形结构的实现
  2. 论文阅读:Fixation Prediction for 360° Video Streaming in Head-Mounted Virtual Reality
  3. java--SSM框架整合简单实例
  4. 在苹果电脑 mac 上安装原神(playCover)
  5. ubuntu20.04下安装Kdevelop并实现图像ORB特征匹配
  6. 笔记本没有网无法本地连接Ubuntu系统的原因
  7. 新浪微博APP开发应用示例之获取指定微博账户的微博内容记录
  8. CentOS7 安装JDK
  9. 升级ipython_Win10中如何装IPython
  10. XPS文件转换PDF小工具,集成了界面,方便大家使用