我是靠谱客的博主 天真水池,最近开发中收集的这篇文章主要介绍MATLAB 数学应用 随机数生成 使用RandStream管理全局流,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

rand、randn、randi 和 randperm 从称为全局流的基础随机数流获取随机数。全局流是一个 RandStream 对象。控制全局流的简单方法是使用 rng 函数。为了进行更全面的控制,RandStream 类使您能够从全局流创建一个单独的流,获得全局流的句柄,并控制随机数生成。

使用 rng 将随机数生成器设置为默认的种子 (0) 和算法(梅森旋转)。保存生成器设置。

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

创建一个由 0 和 1 之间的随机值组成的 1×6 行向量。

x = rand(1,6)
x = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

使用 RandStream.getGlobalStream 返回全局流的句柄,即 rand 从中生成随机数的当前全局流。如果您使用 RandStream.getGlobalStream 获取全局流的句柄,您可以看到您使用 rng 对全局流所做的更改。

globalStream = RandStream.getGlobalStream
globalStream = 
mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

更改生成器种子和算法,并创建一个新的随机行向量。显示 rand 从中生成随机数的当前全局流。

rng(1,'philox')
xnew = rand(1,6)
xnew = 1×6

    0.5361    0.2319    0.7753    0.2390    0.0036    0.5262

globalStream = RandStream.getGlobalStream
globalStream = 
philox4x32_10 random stream (current global stream)
             Seed: 1
  NormalTransform: Inversion

接下来,还原原始生成器设置并创建一个随机向量。结果与用默认生成器创建的原始行向量 x 相匹配。

rng(s)
xold = rand(1,6)
xold = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

默认情况下,随机数生成函数(如 rand)使用全局随机数流。要指定不同流,请创建另一个 RandStream 对象。将其作为第一个输入参数传递给 rand。例如,使用面向 SIMD 的快速梅森旋转创建一个 1×6 随机数向量。

myStream = RandStream('dsfmt19937')
myStream = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Ziggurat
r = rand(myStream,1,6)
r = 1×6

    0.0306    0.2131    0.2990    0.3811    0.8635    0.1334

当您以 myStream 作为第一个输入参数调用 rand 函数时,它从 myStream 中获取数字,并且不影响全局流的结果。

如果要将 myStream 设置为全局流,可以使用 RandStream.setGlobalStream 对象函数。

RandStream.setGlobalStream(myStream)
globalStream = RandStream.getGlobalStream
globalStream = 
dsfmt19937 random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

在许多情况下,控制全局流只需使用 rng 函数,但 RandStream 类允许控制一些高类功能,如选择用于正态随机值的算法。

例如,创建一个 RandStream 对象,并指定转换算法,以便在使用 randn 时生成正态分布的伪随机值。使用 Polar 转换算法而不是默认的 Ziggurat 转换算法生成正态分布的伪随机值。

myStream = RandStream('mt19937ar','NormalTransform','Polar')
myStream = 
mt19937ar random stream
             Seed: 0
  NormalTransform: Polar

将 myStream 设置为全局流。从全局流中创建 6 个均匀分布的随机数。

RandStream.setGlobalStream(myStream)
randn(1,6)
ans = 1×6

    0.2543   -0.7733   -1.7416    0.3686    0.5965   -0.0191

最后

以上就是天真水池为你收集整理的MATLAB 数学应用 随机数生成 使用RandStream管理全局流的全部内容,希望文章能够帮你解决MATLAB 数学应用 随机数生成 使用RandStream管理全局流所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部