您当前的位置: 首页 >  matlab

B417科研笔记

暂无认证

  • 4浏览

    0关注

    154博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Matlab固定随机数

B417科研笔记 发布时间:2020-10-09 13:50:28 ,浏览量:4

在仿真中我们经常要引入一些随机数, 但这些随机数也会导致我们对算法或参数设置的性能的评估有所偏颇。 如果能在两种算法/参数设置的比较中, 把随机数加以固定, 使得比较时两种情况是在相同的随机情况下进行,会更加科学合理。

Matlab中有相关的功能——通过固定随机数种子实现。

Matlab中的随机数函数, rand(), randn()等,其实是基于随机数种子实现的。 如果我们把随机数种子固定了, 那么他们将会产生相同的随机数序列。

随机数种子的函数是rng(seed), 名字非常好记, 其参数seed, 有多种取值:

  • 不加任何参数, 即直接rng()
  • 用0作为种子, 即rng(0)
  • rng('default) 以上三种是等价的。 即用rng产生随机数种子,默认是用0作为种子参数。 另外,任何的正数都可以作为种子参数, 如rng(1),就可以生成与rng()不同的随机数种子 也可以把生成的种子作为参数输入, 如rng(rng(0))。 这里我们只需要记住最简单的用法, 当seed相同时,产生的随机数序列是相同的, 也就可以实现我们要固定随机数的目的。
实现随机数的控制

例如, 我们要比较3种不同的算法,只需要控制三种算法的随机数种子, 那么3种算法运行中的所有随机数都会是一致的。 talk is cheep, show me the code, 下面直接给一个示例的matlab代码来展示下用法:

for i = 1:3
    rng(0)
    s = 0;
    for j = 1:100
        s = s + rand();
    end
    s
end

外层的for循环可以理解为是三种算法,每种算法里, 求100个随机数的和。 最后,打印出来的s是完全一样的。 这说明我们每次rand()生成的随机数序列在每次循环中都是一样的。 为什么呢? **因为我们在每次生成随机数的循环开始前, 先使用 rng(0)固定了随机数种子。 相同的随机数种子下, 生成的是相同的随机数序列, 也就是说这3个循环的100个rand()的结果是完全一样的。

最后, 如何使得每次运行matlab程序时的随机数都一样呢(方便调试)? 很简单, 用以下的代码储存随机数即可:

s = rng(0)
save('s', 's')

把一次生成的随机数种子保存下来。 然后把主程序的代码里改为:

load('s.mat')
rng(s)

就可以固定随机数了。

关注
打赏
1649265742
查看更多评论
立即登录/注册

微信扫码登录

0.0338s