在用Matlab与3DEC/UDEC进行交互时,由于真实模型较大,有时候会先生成一个用于测试的小模型,这时候会经常用到 Matlab 的随机数函数生成随机数。但是每次运行程序,随机数都不一样,导致测试模型不能重复测试,这时候就需要让Matlab生成可重复的随机数。

1. Matlab中如何让随机数可重复

通过首先指定种子来重复生成随机数数组。每次使用相同种子初始化生成器时,始终都可以获得相同的结果。

首先,初始化随机数生成器:

 rng('default');

现在使用种子 1 初始化生成器。

 rng(1);

然后创建随机数数组

 A = rand(3,3)

得到一个随机数矩阵

    0.4170    0.3023    0.1863
    0.7203    0.1468    0.3456
    0.0001    0.0923    0.3968

这时候如果接着创建随机数数组,

 C = rand(3,3)

会得到另一个不同的随机数矩阵

    0.5388    0.2045    0.6705
    0.4192    0.8781    0.4173
    0.6852    0.0274    0.5587

如何能得到与A相同的随机数矩阵呢?这时就需要配合使用种子初始化生成器,将种子生成器与生成随机数函数一起使用即可放心食用

rng(1)
B=rand(3)

这时候就得到了与A相同的随机数矩阵了

    0.4170    0.3023    0.1863
    0.7203    0.1468    0.3456
    0.0001    0.0923    0.3968

在某些情况下,只设定种子并不能保证相同的结果。这是因为代码执行时,随机数函数所用的生成器可能与你所期望的不同。要确保长期可重复性,应同时指定种子和生成器类型。

例如,以下代码将种子设定为 1 并将生成器设置为梅森旋转。

 rng(1,'twister');

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

2. 3DEC中如何生成可重复的随机数

在3DEC中可以使用 set random nseed 或者 set seed n来设置生成随机数的种子。

set random nseed的作用:

将随机数生成器(由 GENERATEJSET 命令使用)的种子设置为整数 nseed。 默认情况下,nseed 等于10000,设定的种子值应与默认值的量级相同。 如果在 NEW 命令后给出 SET random,则在多次运行中可以生成相同的模型。 注:随机种子不会被 NEW 命令重置。

简单来说,该命令可以重复多次划分相同的网格或者节理,以便模型可以多次重复运行。否则,每次划分的网格或者节理都会有差异。

set seed n的作用:

urandgrand 设置随机数生成器的种子。 该种子也由 DFN 生成器使用。

一般在new命令后设置随机数种子。

3dec可重复随机数

3. 结合Matlab和3DEC进行重复模型的生成

通过 Matlab 生成随机节理高度,再转换成 3DEC 命令流。结合种子生成器,生成可重复执行的模型:

重复模型

3DEC重复模型


长风破浪会有时,直挂云帆济沧海。